2016-05-16 21 views
4

の構文仕様:奇妙な構文仕様<a href="https://docs.python.org/3.5/reference/compound_stmts.html#function-definitions" rel="nofollow">function definitions</a>ため

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

これはバグです:https://bugs.python.org/issue27042 - python 3のみがこの申し立てを行います – Eric

+0

誤ったパッチへの参照を私の答えに入れました。 。また、文法自体(パーサージェネレータへの入力)は変更されておらず、間違いなくarglistと言います。 – rici

答えて

2

私にはバグのようです。

それはargument_listparameter_listに変更V3.2まで

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

ました。それは正しいとは言えませんが、だれでもone-line patchを提出しても明らかにそうではないと考えられました。

grammar itselfは改変されていません。

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

をそして、それ以来である:それはまだ言う

フルPythonの文法、Pythonのソースファイルを解析するパーサジェネレータによって読み取られ、使用されているよう

私は思います私たちは、Pythonデコレータはまだ私たちが期待する構文を持っていると結論づけることができます。

+0

パッチを見つけてうれしい仕事! – Eric

関連する問題