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到底层调用。