python装饰器的奇怪语法规范

2024-04-25 14:54:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但口译员不接受。我是误读了语法,还是语法不正确


Tags: name规范decoratorsparameterdef语法functiondecorator
1条回答
网友
1楼 · 发布于 2024-04-25 14:54:48

在我看来像是个文档错误

是的

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

直到v3.2,当argument_list更改为parameter_list。这不可能是对的,尽管提交one-line patch的人显然不这么认为

未修改grammar itself。上面还写着:

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

既然是这样:

the full Python grammar, as it is read by the parser generator and used to parse Python source files

我想我们可以得出这样的结论:Python装饰器仍然具有我们所期望的语法

相关问题 更多 >

    热门问题