Python装饰器的奇怪语法规范

4
函数定义的语法规范 (function definitions) 如下:
funcdef        ::=  [decorators] "def" funcname "(" [parameter_list] ")" ["->" expression] ":" suite
decorators     ::=  decorator+
decorator      ::=  "@" dotted_name ["(" [parameter_list [","]] ")"] NEWLINE
dotted_name    ::=  identifier ("." identifier)*
parameter_list ::=  (defparameter ",")*
                    | "*" [parameter] ("," defparameter)* ["," "**" parameter]
                    | "**" parameter
                    | defparameter [","] )
parameter      ::=  identifier [":" expression]
defparameter   ::=  parameter ["=" expression]
funcname       ::=  identifier

似乎暗示以下语法是有效的:

@some.dotted.name(*what : "is this")
def my_func(x):
    pass

但是它被解释器拒绝了。我是否误读了语法,或者语法本身就有问题?


怀疑这是一个错误:https://bugs.python.org/issue27042 - 只有 Python 3 才会提出这种说法。 - Eric
我在我的答案中提到了有错误的补丁的参考,现在我有时间追踪它。我还指出语法本身(即解析器生成器的输入)没有更改,并且明确表示arglist。 - rici
1个回答

2

看起来这是一份文档错误。

它曾经是。

decorator      ::=  "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE

直到 v3.2,argument_list 才改为 parameter_list。虽然提交了单行补丁的人显然有不同的看法,但这是不正确的。

语法本身并没有被修改。它仍然是这样说的:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE

因此,这就是:

完整的Python语法,由解析器生成器读取并用于解析Python源文件

我认为我们可以得出结论,Python装饰器仍然具有我们所期望的语法。


找到补丁了,干得好! - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接