在 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
接受可变数量的位置参数时,才使用裸露的 *
。您不使用两个 *
。
引用语法,在 Python 2 ,你有
parameter_list ::= (defparameter ",")*
( "*" identifier [, "**" identifier]
| "**" identifier
| defparameter [","] )
在 Python 3 中时,你有
parameter_list ::= (defparameter ",")*
( "*" [parameter] ("," defparameter)*
[, "**" parameter]
| "**" parameter
| defparameter [","] )
其中包括在 *
参数之后的附加参数的规定。
更新:
最新的 Python 3 文档 here .
关于python - 使用 *args、**kwargs 和可选/默认参数调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9872824/