[Python-Dev] PEP 318: Let's propose some useful built-in
decorators
Phillip J. Eby
pje at telecommunity.com
Fri Apr 2 15:35:26 EST 2004
At 03:15 PM 4/2/04 -0500, Kevin Jacobs wrote:
>Guido van Rossum wrote:
>
>>>>class func_attrs(objects):
>>>>
>>>> def __init__(self, **kwds):
>>>> self.attrs = kwds
>>>>
>>>> def __call__(self, funcobj):
>>>> funcobj.__dict__.update(self.attrs)
>>>>
>>>>
>>>Did you leave out the 'return funcobj' from the end of __call__? I
>>>thought that decorators were supposed to be inherently cooperative,
>>>and should return their modified funcobj, or a new func-like-obj.
>>>
>>
>>Sorry, you're right. (I've been thinking of interpreting a None
>>result as "keep the input object" but the code generation would be too
>>messy.
>>
>
>Cool. And now that I have my pedantic hat on, I may as well go all
>out. First,
>why call it func_attrs, when staticmethod and classmethod are underscoreless?
>Second, I know it is effectively the same, but shouldn't the .update line use
>vars(funcobj) instead of funcobj.__dict__? This is something that I am asked
>(often!) by my Python students. I use vars(obj) since it looks less magical.
For that matter, updating the dictionary is nice as a quick trick, but what
if the object doesn't *have* a dictionary? Using setattr would be safer,
if this is intended to be subclassed. Suppose, for example, that
'synchronized' actually returns a callable wrapper written in C, rather
than a function object, and that wrapper then delegates setattr to the
thing it wraps?
So, I think using setattr would be safer, and __dict__.update() is
premature optimization, given that function object creation and decorator
invocation isn't likely to be a performance bottleneck.
More information about the Python-Dev
mailing list