decorators only when __debug__ == True

MRAB python at
Tue Mar 30 03:34:27 CEST 2010

LX wrote:
> Hi all, I have a question about decorators. I would like to use them
> for argument checking, and pre/post conditions. However, I don't want
> the additional overhead when I run in non-debug mode. I could do
> something like this, using a simple trace example.
> @decorator
> def pass_decorator(f, *args, **kw): # what about the slow-down that
> incurs when using pass_decorator?
>     return f(*args, **kw)
> @decorator
> def trace_decorator(f, *args, **kw):
>     print "calling %s with args %s, %s" % (f.func_name, args, kw)
>     return f(*args, **kw)
> trace_enable_flag = False #__debug__
> trace = trace_decorator if trace_enable_flag else pass_decorator
> Trouble is, there is still an additional encapsulating function call.
> Is there any way to eliminate the extra function call altogether?
> Thanks in advance!

I think you have misunderstood certain details about decorators.

This code with a decorator:

     def hello():
         print "hello world"

basically does this:

     def hello():
         print "hello world"
     hello = decorator(hello)

so your non-decorator just needs to return the function it was passed:

     def pass_decorator(func):
         return func

and your trace decorator would be something like this:

     def trace_decorator(func):
         def show(*args, **kwargs):
             print "calling %s with args %s, %s" % (func.func_name, 
args, kwargs)
             result = func(*args, **kwargs)
             print "returning %s from %s" % (result, func.func_name)
             return result
         return show

More information about the Python-list mailing list