2016-05-16 13 views
4

Die Syntax-Spezifikation für function definitions:merkwürdige Syntax-Spezifikation für Python Dekorateure

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 

scheint folgendes vorschlagen, ist syntaktisch gültig:

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

Doch ist es nicht vom Interpreter akzeptiert. Lies ich die Grammatik falsch oder ist die Grammatik nicht korrekt?

+0

Verdächtige dies ist ein Fehler: https://bugs.python.org/issue27042 - nur Python 3 macht diesen Anspruch – Eric

+0

Ich habe einen Verweis auf den fehlerhaften Patch in meine Antwort, jetzt, wo ich die Zeit hatte, um es aufzuspüren . Ich weise auch darauf hin, dass die Grammatik selbst (d. H. Die Eingabe in den Parser-Generator) nicht geändert wurde und Argill definitiv sagt. – rici

Antwort

2

Sieht für mich wie ein Dokumentationsfehler aus.

Es war

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

bis v3.2, wenn argument_list zu parameter_list geändert. Das kann nicht stimmen, aber wer auch immer die one-line patch eingereicht hat, dachte offensichtlich anders.

Die grammar itself wurde nicht geändert. Er sagt noch:

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

Und da das heißt:

die volle Python Grammatik, wie sie von dem Parser-Generator gelesen und verwendet, um Python-Quelldateien zu analysieren

Ich denke, Wir können daraus schließen, dass Python-Dekoratoren immer noch die Syntax haben, die wir alle erwarten.

+0

Nice job den Patch zu finden! – Eric