Unexpected behaviour of inner functions/ decorators

David Stanek dstanek at dstanek.com
Tue Jun 30 14:12:40 EDT 2009

On Tue, Jun 30, 2009 at 1:44 PM, Francesco Bochicchio<bieffe62 at gmail.com> wrote:


> It looks like the decorator uses an older  instance of 'funct', which
> does not yet
> have the attribute dinamically attached to it. This seem to be
> confirmed by the fact that adding the attribute before
> rebinding the function name, the problem disappear:

The decorator is using the original function that you defined. By
decorating 'funct' you are actually rebinding that name to the
'inner_f' function. So the statement 'funct.enabled = True' is
actually creating an enabled property on the 'inner_f' function.

Take a look at this code:

>>> def def_f(f):
...     def inner_f():
...         if iam.enabled:
...             f()
...     iam = inner_f
...     return inner_f
>>> @def_f
... def funct():
...     print 'Ciao'
>>> funct.enabled = True
>>> funct()

blog: http://www.traceback.org
twitter: http://twitter.com/dstanek

More information about the Python-list mailing list