我在这里遗漏了什么吗?为什么“Broken”部分下的代码不能工作?我正在使用Python 2.6。
#!/usr/bin/env python
def func(a,b,c):
print a,b,c
#Working: Example #1:
p={'c':3}
func(1,
b=2,
c=3,
)
#Working: Example #2:
func(1,
b=2,
**p)
#Broken: Example #3:
func(1,
b=2,
**p,
)
答案 0 :(得分:9)
这是grammar:
中的相关位arglist: (argument ',')* (argument [',']
|'*' test (',' argument)* [',' '**' test]
|'**' test)
这里的第一行允许在不使用varargs / kwargs时在最后一个参数后面放一个逗号(这就是为什么你的第一个例子有效)。但是,如果指定了kwargs参数,则不允许在逗号参数后面放置逗号,如第二行和第三行所示。
顺便说一下,语法显示了一个有趣的事情:
这些都是合法的:
f(a=1, b=2, c=3,)
f(*v, a=1, b=2, c=3)
但这不是:
f(*v, a=1, b=2, c=3,)
在**kwargs
之后不允许使用逗号是有道理的,因为它必须始终是最后一个参数。我不知道为什么语言设计师选择不允许我的最后一个例子 - 也许是疏忽?
答案 1 :(得分:5)
Python通常在逗号列表的末尾(在参数列表和容器文字中)允许使用额外的逗号。这样做的主要目标是使代码生成稍微容易一些(您不需要特殊情况下的最后一项或双特殊情况下的单例元组)。
在语法定义中,**kwargs
被单独拉出,没有额外的可选逗号。对于像代码生成这样实用的东西(** kwargs永远是最后一件事,所以你不需要任何特殊情况),我无法想象,所以我不知道为什么Python会支持它