Python中奇怪的语法解析错误?

use*_*060 7 python syntax-error

我在这里错过了什么吗?为什么不应该在"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,
     )
Run Code Online (Sandbox Code Playgroud)

int*_*jay 9

这是语法的相关部分:

arglist: (argument ',')* (argument [',']
                         |'*' test (',' argument)* [',' '**' test] 
                         |'**' test)
Run Code Online (Sandbox Code Playgroud)

这里的第一行允许在不使用varargs/kwargs时在最后一个参数后面放一个逗号(这就是你的第一个例子工作的原因).但是,如果指定了kwargs参数,则不允许在逗号参数后面放置逗号,如第二行和第三行所示.

顺便说一下,语法显示了一个有趣的事情:

这些都是合法的:

f(a=1, b=2, c=3,)
f(*v, a=1, b=2, c=3)
Run Code Online (Sandbox Code Playgroud)

但这不是:

f(*v, a=1, b=2, c=3,)
Run Code Online (Sandbox Code Playgroud)

之后不允许使用逗号是有道理的**kwargs,因为它必须始终是最后一个参数.我不知道为什么语言设计师选择不允许我的最后一个例子 - 也许是疏忽?


Mik*_*ham 5

Python通常在逗号列表的末尾允许额外的逗号(在参数列表和容器文字中).这样做的主要目标是使代码生成稍微容易一些(您不需要特殊情况下的最后一项或双特殊情况下的单例元组).

在语法的定义中,**kwargs单独拉出并且没有额外的可选逗号.对于像代码生成这样实用的东西(**kwargs永远是最后一件事,所以你不需要任何特殊情况),我无法想象,所以我不知道为什么Python会支持它.