I love the decorator in Python!!!

K.-Michael Aye kmichael.aye at gmail.com
Thu Dec 8 11:24:11 EST 2011


On 2011-12-08 11:43:12 +0000, Chris Angelico said:

> On Thu, Dec 8, 2011 at 10:22 PM, K.-Michael Aye <kmichael.aye at 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 understand this one, it seems really useful. And maybe i start to 
sense some more applicability. Like this, with extra flags that could 
be set at run time, I could influence the way a function is executed 
without designing the function too complex, but by decorating it, which 
at the end could be easier to read than complicated if-then statements 
in the function.
Thanks for your example.
Michael





More information about the Python-list mailing list