Python 2.x – 带* args和** kwargs的默认参数
在Python 2.x (我使用2.7),这是正确的方式来使用默认参数与*args
和**kwargs
?
我发现了一个关于这个主题的问题,但这是Python 3 :
用* args,** kwargs和可选/默认参数调用Python函数
在那里,他们说这个方法的作品:
def func(arg1, arg2, *args, opt_arg='def_val', **kwargs): #...
在2.7中,它导致了一个SyntaxError
。 有没有推荐的方法来定义这样的function?
我以这种方式工作,但我猜想有一个更好的解决scheme。
def func(arg1, arg2, *args, **kwargs): opt_arg ='def_val' if kwargs.__contains__('opt_arg'): opt_arg = kwargs['opt_arg'] #...
只需在*args
之前放置默认参数:
def foo(a, b=3, *args, **kwargs):
现在,如果您将它作为关键字参数或第二个位置parameter passing,则会明确设置b
。
例子:
foo(x) # a=x, b=3, args=(), kwargs={} foo(x, y) # a=x, b=y, args=(), kwargs={} foo(x, b=y) # a=x, b=y, args=(), kwargs={} foo(x, y, z, k) # a=x, b=y, args=(z, k), kwargs={} foo(x, c=y, d=k) # a=x, b=3, args=(), kwargs={'c': y, 'd': k} foo(x, c=y, b=z, d=k) # a=x, b=z, args=(), kwargs={'c': y, 'd': k}
请注意,特别是foo(x, y, b=z)
不起作用,因为在这种情况下b
是按位置分配的。
这个代码也适用于Python 3。 将*args
之后的默认*args
放在Python 3中,使其成为仅可由名称指定的“仅关键字”参数,而不是由位置指定。 如果您想在Python 2中使用关键字参数,则可以使用@mgilson的解决scheme。
另一个问题的语法只是python3.x,并且只指定了关键字参数。 它不适用于python2.x。
对于python2.x,我会pop
kwargs:
def func(arg1, arg2, *args, **kwargs): opt_arg = kwargs.pop('opt_arg', 'def_val')
Python 2.x处理的另一种方法是:
def foo(*args, **kwargs): if < kwarg-name > not in kwargs.keys(): kwargs[< kwarg-name >] = < kwarg-name-default-value > return bar(*args, **kwargs)
这不像@ nneonneo的答案处理传递任意*args
到底层调用。