[Python-Dev] Why aren't decorators just expressions?

Larry Hastings larry at hastings.org
Sat Sep 16 05:39:25 EDT 2017

The syntax for decorators in the grammar is quite specific:

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

Decorators can be either a dotted name, or a dotted name followed by 
arguments.  This disallows:

    @mapping['async']  # looking something up in a mapping
    @func(1, 2, 3).async # getting the attribute of the /result/ of a
    function call

Obviously these restrictions haven't been too burdensome, as I've 
labored under them for 13+ years and didn't even notice until just now.  
But it set me to wondering.

If it were me, perpetually lazy sod that I am, I'd have written the 
grammar as

    decorator: '@' expr NEWLINE

and been done with it.

So why don't decorators allow arbitrary expressions?  The PEP discusses 
the syntax for decorators, but that whole debate only concerned itself 
with where the decorator goes relative to "def", and what funny 
punctuation might it use.  It never says "decorators shouldn't permit 
arbitrary expressions because--".  Nor is there any info on wiki page 
with the extensive summary of alternative syntax proposals.

Anybody remember?

I'm not proposing that we allow arbitrary expressions as decorators... 
well, I'm not doing that /yet/ at least.  But like I said, the syntax 
has been this way for 13 years and I don't recall anybody complaining.


/p.s. I experimentally tried modifying the grammar for descriptors to 
allow arbitrary expressions.  The syntax was fine but it crashed in 
ast_for_decorator().  When I updated that to match, it worked fine!  The 
diff is short and mainly consists of deleted code.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20170916/d0696365/attachment-0001.html>

More information about the Python-Dev mailing list