On Thu, Dec 8, 2011 at 10:22 PM, K.-Michael Aye <kmichael....@gmail.com> wrote: > I am still perplexed about decorators though, am happily using Python for > many years without them, but maybe i am missing something? > For example in the above case, if I want the names attached to each other > with a comma, why wouldn't I just create a function doing exactly this? Why > would I first write a single name generator and then decorate it so that I > never can get single names anymore (this is the case, isn't it? Once > decorated, I can not get the original behaviour of the function anymore.
The example given is a toy. It's hardly useful. However, there are a number of handy uses for decorators; mostly, they consist of giving a single simple keyword to a complicated set of logic. One example is the @classmethod and @staticmethod decorators - the code to implement them could be uglier than nested inline assembly, but you don't have to care, because you just type "@staticmethod" in front of your def statement and it does its magic. Here's a handy trick that I'm sure someone has done in a more sophisticated way: def trace(func): if debugmode: return lambda *a,**ka: (print(">"+func.__name__),func(*a,**ka),print("<"+func.__name__))[1] return func Then you put @trace in front of all your functions, and if debugmode is False, nothing will be done - but set it to true, and you get console output at the entry and exit of each function. >>> @trace def test(x): print("Test! "+x) return 5 >>> test("asdf") >test Test! asdf <test 5 Again, it's helpful because it condenses all the logic (including the 'debugmode' flag) down to a single high level directive: "Trace this function". ChrisA -- http://mail.python.org/mailman/listinfo/python-list