Conditional decoration

Devin Jeanpierre jeanpierreda at gmail.com
Mon Jun 18 19:51:12 EDT 2012


On Mon, Jun 18, 2012 at 6:49 PM, Emile van Sebille <emile at fenx.com> wrote:
> On 6/18/2012 3:16 PM Roy Smith said...
> class myDecorator(object):
>    def __init__(self, f):
>        self.f = f
>    def __call__(self):
>        print "Entering", self.f.__name__
>        self.f()
>        print "Exited", self.f.__name__

I dunno about other people, but I generally avoid class decorators
because they do not behave the way functions do when applied as a
decorator for a method.
This is a decorator taken out of some of my own source code. I was
mostly dicking around with things, as opposed to actually coding. The
docstring was even more ridiculous.
 from functools import reduce
 def rapply(*args):
 """apply(f, ...) <-> rapply(..., f)"""
 return args[-1](*args[:-1])
 def condecorator(condition, *decorators):
 if condition:
 return lambda f: reduce(rapply, reversed(decorators), f)
 else:
 return lambda f: f
Example usage:
 @condecorator(condition,
 decorator1,
 decorator2)
 def decorated(...):
 ...
equivalent to:
 def decorated(...):
 ...
 if condition:
 decorated = decorator1(decorator2(decorated))
-- Devin


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /