[Python-Dev] method decorators (PEP 318)

Alex Martelli aleaxit at yahoo.com
Sat Mar 27 14:47:44 EST 2004


On 2004 Mar 27, at 19:11, Skip Montanaro wrote:

>     Barry> attributes, but decorators can also do the trick in a nasty 
> way:
>     Barry>
>     Barry> def foobar [
>     Barry>     lambda f: f.author = 'Guido van Rossum',
>     Barry>     lambda f: f.deprecated = True,
>     Barry>     classmethod] (self, arg):
>     Barry>     # Now what?
>
>     Alex> Not necessarily all that nasty:
>
>     Alex> def foobar [ with_attributes(
>     Alex>          author="Guido van Rossum",
>     Alex>          deprecated=True),
>     Alex>      classmethod] (cls, args):
>     Alex>          pass
>
> Both cases demonstrate why I don't like the decorator-before-args 
> option.
> Where are the args?  Like I said in an earlier post most of the time I 
> look
> at a function def wanting a quick reminder how to call it.  If the 
> argument
> list doesn't at least start on the same line as the def I think that 
> will be
> tougher.

As long as the decorators don't come between the def and the function 
name (that WOULD be far too early and impede looking for 'def foo' to 
easily locate the definition) I'll be OK, but, sure, I do agree that 
right before the colon is the best place for the decorators.  I was 
just using the same hypothetical syntax as Barry was using in his own 
snippet.

>     Alex> with a built-in 'with_attributes' equivalent to:
>
>     Alex> def with_attributes(f, **kwds):
>     Alex>      for k, v in kwds.iteritems():
>     Alex>          setattr(f, k, v)
>     Alex>      return f
>
> Not quite.  It has to be written as a function which returns another
> function, e.g.:
>
>     def attrs(**kwds):
>         def decorate(f):
>             f.__dict__.update(kwds)
>             return f
>         return decorate

Yes, you're right, this is what the semantics must be (assuming that 
"setattr(f, n, v)" does absolutely nothing more than "f.__dict__
[n] = v", a hypothesis I wasn't ready to make -- I'm not sure it's 
currently guaranteed by the language reference manual -- but if I'm 
wrong and it IS so guaranteed and I just missed the spot thus 
guaranteeing, the bulk update is of course a speedier approach than the 
loop I had).


Alex




More information about the Python-Dev mailing list