在Python 2.x(我使用2.7)中,哪种方式是在*args
和**kwargs
中使用默认参数的正确方式?
我发现了一个与本主题相关的关于SO的问题,但那是针对Python 3的:
Calling a Python function with *args,**kwargs and optional / default arguments
在那里,他们说这种方法行得通:
def func(arg1, arg2, *args, opt_arg='def_val', **kwargs):
#...
在Python 2.7中,它的结果是SyntaxError
。有什么推荐的方法来定义这样的函数吗?
我是这么想的,但我想还有更好的解决办法。
def func(arg1, arg2, *args, **kwargs):
opt_arg ='def_val'
if kwargs.__contains__('opt_arg'):
opt_arg = kwargs['opt_arg']
#...
7条答案
按热度按时间oyt4ldly1#
只需将默认参数放在
*args
之前:现在,如果您将
b
作为关键字参数或第二个位置参数传递,它将被显式设置。示例:
请特别注意,
foo(x, y, b=z)
不起作用,因为b
是按位置分配的。这段代码在Python 3中也能用。在Python 3中,把默认的arg * 放在 *
*args
之后,使它成为一个“keyword-only”参数,它 * 只能 * 由名称指定,而不是由位置指定。如果你想要Python 2中的keyword-only参数,你可以使用@mgilson的solution。lymgl2op2#
另一个问题中的语法是python3.x only,并且只指定了关键字参数,它在python2.x上不起作用。
对于python2.x,我会用kwargs来
pop
它:kx7yvsdv3#
与@yaccob的方法类似,但清晰简洁:
在Python 3.5或更高版本中:
注意:您可以使用InPython 2
在Python 3.5中
在Python 3.9中
ygya80vv4#
您也可以使用如下的装饰器:
然后才做:
例如:
tyg4sfes5#
在尽量使解决方案更通用、更紧凑的同时,坚持使用您的解决方案方法,我建议您考虑以下做法:
ppcbkaq56#
Python 2.x的另一种处理方式:
与@nneonneo的应答不同,它处理向底层调用传递任意
*args
。06odsfpq7#
这个答案是什么Daniel Américo suggested的延伸。
如果没有 * 严格 * 定义kwarg值,这个装饰器会分配默认的kwarg值。
结果
变量
如果要使用函数定义中所写的默认值,可以使用
f.func_defaults
访问参数默认值,它列出了默认值。您必须以f.__code__.varnames
结尾使用zip
,以便将这些默认值与变量名相匹配。