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