[Edu-sig] explaining about decorators
Kirby Urner
kurner at oreillyschool.com
Wed Apr 17 07:47:19 CEST 2013
I'm sure this could be improved upon and/or is discussed more eloquently
elsewhere. I'm inviting links, comments.
I recall our own discussion here on edu-sig where we played with
@D
def f(x):...
as taking a Derivative of f. Guido didn't think it was such a great idea
as I recall.
http://aroberge.blogspot.com/2005/04/computing-derivatives-using-python.html
Kirby
===
Excerpt from a note to a student:
Why do we need decorators you ask?
We should go back to Guido's original complaint about the old way of doing
it, which was to define a method, say m, and then go m = staticmethod(m)
at the end, to apply a transformation to the method, which would not change
its name, but would make it a static method, meaning it did not require
self,
nor even the class as a first argument:
>>> class Foo:
... def add(a,b):
... return a + b
... add = staticmethod(add)
...
>>> obj = Foo()
>>> obj.add(2,3)
5
Likewise property( ) and classmethod( ): these were applied after method m
had already been defined, retroactively as it were. That was Guido's
complaint,
the fact that transformations were applied as a footnote, as it were,
rather than
boldly up front (at the top).
All a decorator is, is syntax for saying "the function or class defined
below
is going to be put through @this and @that ringer where 'ringer' means
other classes or functions". It's a way of indicating the transformations
up
front, versus waiting until the bottom / end of method, which Guido thought
a place of relative obscurity, maybe on some next page. Buried. Harder to
parse.
These two say the same thing:
class A:
pass # could go on for pages
A = foo(bar(A))
@foo
@bar
class A:
pass
Like so much of Python, such syntax may be put to nefarious uses,
i.e. Python gives you more than enough rope to hang yourself with its
liberal / powerful syntax. Misuses of decorators are certainly possible,
where a "misuse" might be anything that complicates, obscures,
confuses.
Back to the original example:
>>> class Foo:
... @staticmethod
... def add(a,b):
... return a + b
has a certain elegance about it. In retrospect, the innovation has proved
powerful.
As Raymond Hettinger recounts in his recent Pycon keynotes, it was a case
of
Guido asking everyone for feedback, their coming to near consensus in a
rare
moment, and him doing something else anyway. Something like that.
-Kirby
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/edu-sig/attachments/20130416/2c2ba97c/attachment.html>
More information about the Edu-sig
mailing list