在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)
最后,我可以结合两种形式
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) ...
我最初的想法是,这可能是因为一个函数
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测试)。有没有我想念的原因?并且,有没有一种方法可以得到我上面描述的行为(具有带默认参数的* args)-我知道我可以通过操纵函数中的kwargs字典来模拟这种行为。
您 可以 在Python 3中做到这一点。
def func(a,b,*args,kw1=None,**kwargs):
*仅当您要指定仅关键字参数 而不使用 接受可变数量的位置参数时,才使用裸露*args。您不用两个*。
*
*args
引用语法,在Python 2中,您有
parameter_list ::= (defparameter ",")* ( "*" identifier [, "**" identifier] | "**" identifier | defparameter [","] )
而在Python 3中,
parameter_list ::= (defparameter ",")* ( "*" [parameter] ("," defparameter)* [, "**" parameter] | "**" parameter | defparameter [","] )
其中包括在参数之后提供其他参数的规定*。
更新:
最新的Python 3文档在这里。