[omaha] Decorators
Jeff Hinrichs
JeffH at delasco.com
Tue Jan 15 20:29:11 CET 2008
Chris,
The ddj article was excellent. I had not read it before. Thanks!
I agree in principle with your sentiments about decorators. However,
from time to time they do come in handy and if used/implemented
properly/wisely, increase readability. Personally, I think that
anything that reduces readability is a bug. (e.g. I'm torn in the debate
over map v. list comprehensions. I feel that map is more readable than
the equivalent list comprehension. But that might be due to familiarity
so I've been forcing myself to use comprehensions to see if I change my
mind.)
http://wiki.python.org/moin/PythonDecoratorLibrary is a decent resource
for some decorator use cases. Ones I have used are Memoizing, dumpArgs
and Deprecation warnings.
-j
-----Original Message-----
From: omaha-bounces at python.org [mailto:omaha-bounces at python.org] On
Behalf Of Chris Calloway
Sent: Tuesday, January 15, 2008 9:42 AM
To: Omaha Python Users Group
Subject: Re: [omaha] Decorators
Eli Criffield wrote:
>> Decorators in python are syntactic sugar to let you wrap a
>> function/method with another function.
Hey guys, two things.
1) This article about decorators is what you need to know, is
comprehensive, and is the most digestible thing about decorators out
there:
http://www.ddj.com/184406073
The Python documentation about decorators should be as good as that
article. And the fact that it's not says, um, several things I don't
want to go into.
Also, here's another very respectable article, if you already understand
the previous one (and a good bit about metaclasses):
http://www.ibm.com/developerworks/linux/library/l-cpdecor.html
(The good Dr. Mertz might be the best writer about Python out there.)
2) You don't need the third party decorator module. It just pulls in
some predefined decorators that some people have found useful like
memoize, locked, delayed, threaded, and blocking. Plus it adds a
decorator which is confusingly called "decorator," and which you *can*
use to create decorators of a particular convention that *may*
occasionally be useful (if using a factory-factory could ever be
useful).
Most people who use decorators already have their own utility module of
useful decorators.
The thing about decorators is they get used a lot by decorator-happy
people who just learned about them or are trying to be overly clever.
They are seldom all that useful. They have their place. There are some
pretty standard decorators like memoize that many people understand
already without having to look at what they do or how they do it.
But often decorator usage is a bit overblown. Anything more than the
simplest decorators add unnecessary and unreadable complexity to you
code. And you don't want that. It isn't pythonic to add unnecessary and
unreadable complexity to you code. The idea is to quickly write useful,
testable, tested, sharable, and maintainable code; not to prove what an
awesome computer scientist you are. :)
You have to invest a lot to properly understand and use decorators. And
then they get only a little and often trivial usage (do we really need
an "author" attribute added to all of our functions; and if so, do we
really need a decorator to do that?). Most of the time, decorators
aren't worth it.
Decorators are most useful for dorking around with metaclasses, which is
another high investment/low return pattern. They're something you need
to know to understand other people's code sometimes. If you find
yourself using them a lot, you need to look in the mirror and ask
yourself if you've really got a good overriding reason. Decorators tend
to add "magic" at the cost of readability.
They can also be seriously misused because using them requires
remembering and following some recommendations that are not enforced by
Python. The third party decorator module's "decorator" decorator is
supposed to help with that somewhat. But then, if you need help with
that, you probably shouldn't be using them.
Certain levels of abstraction come at a steep cost. If understanding the
abstraction is more difficult than understanding what is being
abstracted, some soul searching is in order.
Apparently, decorators had to be added to Python because Java had them.
Oof.
Notice that even though decorators are officially part of Python syntax,
the official Python tutorial doesn't mention them. Anywhere. The fact
is, if you know and need the decorator *programming pattern* (and the
need and the knowledge should come before throwing around the syntax),
then you don't even need the syntatic sugar that Python provides to use
them. There were two built-in decorators (classmethod and staticmethod)
already available in Python 2.2 before the decorator syntax was even
added in Python 2.4.
It's just passing a callable to a callable which returns a callable
which is then assigned to the original callable's identifier. Like this:
a = b(a)
where "a" is callable as well as b. The callable "b" just "decorates"
the callable "a" with, um, something. Like maybe a new attribute.
The decorator syntax just moves the order of reading the code around by
showing "b" will decorate "a" after "a" is defined:
@b
def a(some, arguments, maybe):
# a's body goes here
It'd kind of like saying, "Here's an ornament which will go on the tree
I'm about to put up," and then saying, "Here's the tree!," instead of
saying, "Here's the tree, now let's decorate it with these ornaments."
Six of one...
--
Sincerely,
Chris Calloway
http://www.seacoos.org
office: 332 Chapman Hall phone: (919) 962-4323
mail: Campus Box #3300, UNC-CH, Chapel Hill, NC 27599
_______________________________________________
Omaha Python Users Group mailing list
Omaha at python.org
http://mail.python.org/mailman/listinfo/omaha
http://www.OmahaPython.org
More information about the Omaha
mailing list