cfpete cfpete - 2 months ago 8
Python Question

how to do a conditional decorator in python 2.6

Is it possible to decorator a function conditionally. For example, I want to decorate the function

foo()
with a timer function (
timeit
) only doing_performance_analysis is
True
(see the psuedo-code below).

if doing_performance_analysis:
@timeit
def foo():
"""
do something, timeit function will return the time it takes
"""
time.sleep(2)
else:
def foo():
time.sleep(2)

Answer

Decorators are simply callables that return a replacement, optionally the same function, a wrapper, or something completely different. As such, you could create a conditional decorator:

class conditional_decorator(object):
    def __init__(self, dec, condition):
        self.decorator = dec
        self.condition = condition

    def __call__(self, func):
        if not self.condition:
            # Return the function unchanged, not decorated.
            return func
        return self.decorator(func)

Now you can use it like this:

@conditional_decorator(timeit, doing_performance_analysis)
def foo():
    time.sleep(2)