[Python-ideas] Decorator syntax

MRAB python at mrabarnett.plus.com
Wed Sep 2 23:42:33 CEST 2009


Georg Brandl wrote:
> MRAB schrieb:
>> James Y Knight wrote:
>>> On Sep 2, 2009, at 6:15 AM, Rob Cliffe wrote:
>>>
>>>> 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?
>>> Indeed, it's a silly inconsistent restriction. When it was first added I 
>>> too suggested that any expression be allowed after the @, rather than 
>>> having a uniquely special restricted syntax. I argued from consistency 
>>> of grammar standpoint. But Guido was not persuaded. Good luck to you. :)
>>>
>> [snip]
>> I can see no syntactic reason to restrict what can appear after the @.
>> If someone chooses to abuse it then that's unPythonic, but not illegal.
> 
> I do see a reason.  I have no problems with
> 
>    @foo.bar
>    @foo.bar[baz]
>    @foo.bar(baz)
> 
> But this is ugly to me:
> 
>    @a + b
>    def foo(): pass
> 
Ugly, yes.

> As is this:
> 
>    @a or (c and d)
>    def foo(): pass
> 
Agreed.

> Having the decorator expression "opened" by @ but not "closed" feels bad.
> 
But:

     @foo

isn't "closed" either.

> However, this looks better to me:
> 
>    @(a + b)
>    @(a or (c and d))
> 
Conditions in 'if' and 'while' statements don't need parentheses, so why
do decorators?

> So, in terms of Grammar/Grammar, what about
> 
>    decorator: '@' atom trailer* NEWLINE
> 
I say "keep it clean", ie no parentheses except where operator priority 
or clarity require them.

IMHO, if a user writes something that's ugly then call it unPythonic;
consenting adults and all that. :-)



More information about the Python-ideas mailing list