在 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
函数内部的字典来模拟该行为。
原文由 mgilson 发布,翻译遵循 CC BY-SA 4.0 许可协议
你 可以 在 Python 3 中做到这一点。
裸
*
仅在您想要指定仅关键字参数 而不 接受可变数量的位置参数时使用*args
。你不使用两个*
s。引用语法,在 Python 2 中,你有
而在 Python 3 中,你有
其中包括在
*
参数之后提供附加参数。更新:
最新的 Python 3 文档 在这里。