[Python-ideas] [Python-Dev] Decorator syntax

Carl Johnson cmjohnson.mailinglist at gmail.com
Wed Sep 2 12:34:49 CEST 2009

Crossposting to Python-ideas,

I asked for the same change to the grammar a couple months back on

See http://mail.python.org/pipermail/python-ideas/2009-February/thread.html#2787

I'm all for it, but you'll have to convince Guido that this won't
result in confusing to read code. My own examples, unfortunately did
not advance your cause, as Guido explained, "My brain hurts trying to
understand all this. I don't think this bodes well as a use case for a
proposed feature." :-D The trouble is that I was using lambdas upon
lambdas to do all kinds of Ruby block-esque tricks. OTOH, if you come
up with some simple, clear use cases though, and I think he might
still be persuadable to make a simple change to the grammar.

— Carl Johnson

Rob Cliffe <rob.cliffe at btinternet.com> wrote:

> Hi All,
> This is my first post to python-dev so I will briefly introduce myself:  My
> name is Rob Cliffe and I am a commercial programmer living in London, UK.  I
> have some 30 years of programming experience but have only been using Python
> for a couple of years.
> First I want to say what a fantastic language Python is.  It is THE best
> language for development in my opinion, and a joy to use.
> My specific issue:
> I eventually got my head round decorator syntax and realised that what came
> after the '@' was (basically) a function that took a function as argument
> and returned a function as result.
> However it seems to me unPythonesque (i.e. an exception to Python's normal
> consistency) that the syntax of what follows the '@' should be restricted to
> either a single (function) identifier or a single (function) identifier with
> an argument list.
> The example I tried, which seems not an unreasonable sort of thing to do,
> was along the lines of:
> def deco1(func):
>     <deco1-suite>
> def deco2(func):
>     <deco2-suite>
> DecoList = [deco1, deco2]
> @DecoList[0]    # NO - CAUSES SYNTAX ERROR
> def foo():
>     pass
> I am sure other guys have their own examples.
> I am of course not the first person to raise this issue, and I see that
> Guido has a "gut feeling" against allowing a general expression after the
> '@'.
> BUT - a general expression can be "smuggled in" very easily as a function
> argument:
> def Identity(x): return x
> @Identity(DecoList[0])    # THIS WORKS
> def foo():
>     pass
> So - the syntax restriction seems not only inconsistent, but pointless; it
> doesn't forbid anything, but merely means we have to do it in a slightly
> convoluted (unPythonesque) way.  So please, Guido, will you reconsider?
> Best wishes
> Rob Cliffe

More information about the Python-ideas mailing list