[Python-Dev] method decorators (PEP 318) - decorators vs transforms
Jewett, Jim J
jim.jewett at eds.com
Fri Mar 26 11:56:04 EST 2004
Guido (based on discussion with Robert Mollitor and Jim Hugunin)
wrote that there are two very different use cases.
We have been discussing transformers, which change how/what the
function does. But many uses (such as "release" from the PEP)
are true decorators, which are really closer to:
def foo():
pass
foo.attr = val
> For (2) I am thinking aloud here:
> def foobar(self, arg):
> @author: "Guido van Rossum"
> @deprecated
> pass
If I understand, the grammar production would be
'@'+identifier [':' expression]
with expression defaulting to True.
Then
def foobar as [classmethod, synchronized(lock23)] (args):
@author: "Guido van Rossum"
@version: (2,3)
@deprecated
@variant: @version + (@author,)
# this next one might be asking for trouble
@x_starts_as: @x
@magic_number: random.randint(34) + y
@version: @version + ("alpha", 1)
"This is an example function"
x = 5
return x
would be equivalent to:
def foobar(args):
"This is an example function"
x = 5
return x
# Evaluate the transforms first, in case they return a
# different object, which would not have the annotations.
foobar = classmethod(foobar)
foobar = synchronized(lock23)(foobar)
# Now the annotations go on the final object. Do we
# need to worry about immutable objects, or is that the
# programmer's own fault?
foobar.author = "Guido van Rossum"
foobar.version = (2,3)
# Default value is True
foobar.deprecated = True
# Do decorators have access to current attributes?
# Did '@' read better than 'self' or 'this'?
foobar.variant = foobar.version + (foobar.author,)
# Does the attribute have access to the local scope?
foobar.x_starts_as = foobar.x
# Do decorators have access to the enclosing scope?
foobar.magic_number = random.randint(34) + y
# Decorators don't really have to commute, do they?
foobar.version = foobar.version + ("alpha", 1)
-jJ
More information about the Python-Dev
mailing list