confused in decorate and closure

Peter Otten __peter__ at web.de
Thu Sep 13 02:32:38 EDT 2012


月忧茗 wrote:

> HI,  I have some test code:
> 
> 
> def num(num):
>     def deco(func):
>         def wrap(*args, **kwargs):
>             inputed_num = num
>             return func(*args, **kwargs)
>         return wrap
>     return deco
> 
> 
> @num(5)
> def test(a):
>     return a + inputed_num
> 
> print test(1)
> 
> 
> when run this code,  I got an error shows that 'inputed_num' is not
> defined
> 
> My question is:
> In wrap function,  is there not a closure that func can got 'inputed_num'
> ?
> 
> 
> 
> Anyway, If not,  how should I do to got my aim:  Initialize some value,
> and use this value directly in the main function.

Variable scopes are determined statically. In

> def test(a):
>     return a + inputed_num

"inputed_num" is a global variable.

> @num(5)

is not a macro, but a shortcut that tells Python to execute

test = num(5)(test)

and thus does not change the scopes. To get the desired effect you have to 
turn "inputed_num" into an explicit function argument, for example:

>>> def num(n):
...     def deco(f):
...             def wrap(*args, **kw):
...                     return f(n, *args, **kw)
...             return wrap
...     return deco
... 
>>> @num(42)
... def test(n, a):
...     return n + a
... 
>>> test(1)
43





More information about the Python-list mailing list