有没有办法实现一个具有可变数量的参数(* args)和非可选关键字参数的函数?我想实现这样的事情:
def foo(positional arguments, keyword arguments,*args):
{
...
}
但是,现在似乎无法正确调用此功能。设arg1和arg2是我们想要在函数调用中传递的类型(* arg)的参数。
foo(posargs, kwarg=value, arg1, arg2)
不允许(kwargs必须最后),而:
foo(posargs,arg1,arg2,kwarg=value)
会导致错误的函数调用,因为arg1在位置上被分配给kwarg,尽管kwarg在函数调用中被提供了一个关键字值。
是否有任何替代的定义或调用语法可以避免这种情况,(除了在函数调用中使用kwarg值作为位置参数调用的简单解决方案之外)?
答案 0 :(得分:2)
这是在PEP 3102中引入的Python 3功能。 (Python, default keyword arguments after variable length positional arguments)
在Python 2中,您必须从**kwargs
中提取关键字参数:
def foo(positional arguments, *args, **kwargs):
# for a required positional argument
try:
kwarg = kwargs.pop('kwarg')
except KeyError as e:
raise TypeError('Required positional argument not found', e)
# or for an optional positional argument
kwarg = kwargs.pop('kwarg', None)
if kwargs:
raise TypeError('Unexpected positional arguments', kwargs)
答案 1 :(得分:0)
* args会将无法比较的位置参数收集到元组中。 ** kwargs用于收集无法匹配的关键字参数,并将它们放入元组而不是字典中。
来自O' Reilly的学习Python第535页:
def f(a, *pargs, **kargs):
print (a, pargs, kargs)
f(1,2,3,x=1, y=2)
1 (2, 3), {'y':2, 'x':1}
从同一本书的第531页开始:"在电话和标题中,** args表格必须出现在最后。如果以任何其他顺序混合参数,则会出现语法错误,因为组合可能不明确。"