[Python-Dev] Re: __metaclass__ and __author__ are already decorators

Phillip J. Eby pje at telecommunity.com
Sat Aug 21 23:48:43 CEST 2004


At 05:34 PM 8/21/04 -0400, Paul Morrow wrote:
>Phillip J. Eby wrote:
>
>>At 05:15 PM 8/21/04 -0400, Paul Morrow wrote:
>>
>>>Christophe Cavalaria wrote:
>>>
>>>>can it be ? There's also the fact that it can't handle named parameters
>>>>like a regular function call. You can't write that :
>>>>def foo():
>>>>     __decoration__ = (1,1,param=True)
>>>
>>>
>>>As far as I know, we can't do that with the current decorator proposals 
>>>either.
>>
>>@decoration(1,1,param=True)
>>def foo(whatever):
>>     pass
>
>Ok, then whatever changes you've made to the Python system to support that 
>would allow the same syntax to be used in what I'm suggesting.

Huh?  @decoration(1,1,param=True) is evaluated at the place where it 
appears.  The *return value* of that expression is then called, passing in 
the foo function.  In other words, the above is equivalent to today's:

     def foo(whatever):
         pass

     foo = decoration(1,1,param=True)(foo)

except that the first assignment to 'foo' doesn't happen, only the second 
one.  If the 'foo' function is a single expression, of course, today you 
can do the straightforward:

     foo = decoration(1,1,param=True)(lambda whatever: something)

So, "@x func" is effectively a macro for "func = x(func)", where 'func' may 
be a function, or another decorator.  That is:

     @x
     @y
     @z
     def foo():
         ...

is shorthand for 'foo = x(y(z(foo)))', no matter what the x/y/z expressions 
actually are.  So there are *no* "changes to the Python system" here, just 
a very small amount of syntax sugar.

By contrast, your attribute assignment approach isn't nearly so simple, as 
you will see if you attempt to write an implementation.



More information about the Python-Dev mailing list