On Thursday, December 8, 2011 7:43:12 PM UTC+8, Chris Angelico wrote: > On Thu, Dec 8, 2011 at 10:22 PM, K.-Michael Aye <kmicha...@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
I did use decorators to turn functions into iterables to be traced. -- http://mail.python.org/mailman/listinfo/python-list