用* args,** kwargs和可选/默认参数调用Python函数

在python中,我可以定义一个函数,如下所示:

def func(kw1=None,kw2=None,**kwargs): ... 

在这种情况下,我可以调用func:

 func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis) 

我也可以定义一个函数为:

 def func(arg1,arg2,*args): ... 

这可以称为

 func(3,4,additional,arguments,go,here,Ellipsis) 

最后,我可以结合这两种forms

 def func(arg1,arg2,*args,**kwargs): ... 

但是,不起作用的是:

 func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #SYNTAX ERROR (in python 2 only, apparently this works in python 3) ... 

我原来的想法是,这可能是因为一个function

 def func(arg1,arg2,*args,kw1=None): ... 

可以称为

 func(1,2,3) #kw1 will be assigned 3 

所以这会引起一些模棱两可的问题,究竟应该把3个打包成args还是kwargs。 但是,在python 3中,只能指定关键字参数:

 def func(a,b,*,kw=None): #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3) ... 

有了这个,似乎没有句法含糊:

 def func(a,b,*args,*,kw1=None,**kwargs): ... 

但是,这仍然会导致语法错误(使用Python3.2进行testing)。 有没有这个原因,我失踪了? 而且,有没有办法让我上面描述的行为(有*参数默认参数) – 我知道我可以通过操作函数内的kwargs字典来模拟该行为。

可以在Python 3上做到这一点。

 def func(a,b,*args,kw1=None,**kwargs): 

只有当你想指定关键字唯一的参数而不接受带有*args的可变数目的位置参数时,才使用bare * 。 你不使用两个*

引用语法,在Python 2中,你有

 parameter_list ::= (defparameter ",")* ( "*" identifier [, "**" identifier] | "**" identifier | defparameter [","] ) 

而在Python 3,你有

 parameter_list ::= (defparameter ",")* ( "*" [parameter] ("," defparameter)* [, "**" parameter] | "**" parameter | defparameter [","] ) 

其中包括*参数之后的附加参数的规定。

如果你想做一个混合,记住* args和** kwargs必须是最后指定的参数。

 func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #Invalid func(arg1,arg2,kw1=None,kw2=None,*args,**kwargs): #Valid