[Python-Dev] Class decorators
Nick Coghlan
ncoghlan at gmail.com
Sat Apr 1 06:58:34 CEST 2006
Jim Jewett wrote:
> Nick Coghlan wrote:
>
>> [ much good, including the @instance decorator ]
>
>> P.S. If all you want is somewhere to store mutable
>> state between invocations, you can always use the
>> function's own attribute space
>
> >>> def f(): print "Hi world from %s!" % f
>
> >>> f()
> Hi world from <function f at 0x00AE90B0>!
>
> Not really. That assumes the expected name is (permanently) bound to
> *this* function in this function's globals. That's normally true, but
> not always, so relying on it seems wrong.
Well, true. If you want it to be bullet-proof, you have to use a closure instead:
>>> def make_f():
... def f():
... print "Hi world from %s!" % f
... return f
...
>>> f = make_f()
>>> f()
Hi world from <function f at 0x00AE90B0>!
The point about the decorators still holds - they stay with the function
they're decorating (the inner one), and you don't need to make any of the
changes needed in order to decorate the class instead.
The above is also a use case for a *function* decorator I've occasionally
wanted - an @result decorator, that is the equivalent of the @instance
decorator I suggested for classes:
>>> def result(f):
... return f()
...
>>> @result
... def f():
... def f():
... print "Hi world from %s!" % f
... return f
...
>>> f()
Hi world from <function f at 0x00AE90B0>!
I never actually did it, though, as I was stuck on Python 2.2 at the time.
This is something of a tangent to the real discussion though, so I'll leave
this one there :)
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://www.boredomandlaziness.org
More information about the Python-Dev
mailing list