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
然而,翻译不接受它。我误解了语法,还是语法不正确?
答案 0 :(得分:2)
对我来说看起来像文档错误。
是
decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
直到v3.2,当argument_list
更改为parameter_list
时。这不可能是正确的,尽管提交one-line patch的人显然不这么认为。
grammar itself未被修改。它仍然说:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
因为那是:
完整的Python语法,因为它由解析器生成器读取并用于解析Python源文件
我认为我们可以得出结论,Python装饰器仍然具有我们所期望的语法。