[英]How to define function with dependant keyword arguments in Python?
我有一個帶有1個位置參數和2個關鍵字參數的函數,如下所示:
def foo(arg1, kw_arg1='Keyword Argument', kw_arg2='Keyword Argument'):
print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))
現在,我希望第二個關鍵字參數的默認值kw_arg2
取決於kw_arg1
。 更精確地說,我要的價值kw_arg2
默認kw_arg1
當它不傳遞給函數foo
。
需求的功能原型為:
def foo(arg1, kw_arg1='Keyword Argument', kw_arg2=kw_arg1):
print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))
但是,這會在Python 3.6.0上運行時導致NameError
基本解決方案
通過將函數定義為,我找到了解決方法:
def foo(arg1, kw_arg1='Keyword Argument', kw_arg2=None):
if kw_arg2 is None:
kw_arg2 = kw_arg1
print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))
但是,從隱含地說明kw_arg1
和kw_arg2
之間的關系的意義上來說,我發現此實現有些限制。 另外,我也失去了將kw_arg2
設置為None
的能力。
我想知道如何通過一些更明確的解決方法來實現這一目標。
一種實現方法是使用**kwargs
,並要求用戶根據需要將kw_arg2
給函數作為關鍵字參數(即,記錄此內容!)。
這樣的好處是,如果用戶向kw_arg2
提供None
, kw_arg2
None
kw_arg2
。
這種方法的缺點是用戶必須提供kw_arg2
作為關鍵字參數,不能僅僅依靠提供位置參數,而且僅通過查看函數定義,該函數采用什么參數就不那么明顯了。
def foo(arg1, kw_arg1='Keyword Argument', **kwargs):
"""A function that does foo.
Args:
arg1: ...
kw_arg1: ...
kw_arg2: Will default to the value of kw_arg1 if no
value is passed to this key word argument.
"""
if 'kw_arg2' in kwargs:
kw_arg2 = kwargs['kw_arg2']
else:
kw_arg2 = kw_arg1
print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))
如果您希望用戶也可以將kw_arg2
作為位置參數傳遞, kw_arg2
可以嘗試使用* args和** kwargs進行一些欺騙,但是當然這是您需要小心謹慎並平衡潛力的方法濫用與收益:
def foo(arg1, kw_arg1='Keyword Argument', *args, **kwargs):
"""A function that does foo."""
if 'kw_arg2' in kwargs:
kw_arg2 = kwargs['kw_arg2']
elif args:
kw_arg2 = args[0]
else:
kw_arg2 = kw_arg1
print('The arguments are: {}, {}, {}'.format(arg1, kw_arg1, kw_arg2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.