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