Peter Otten
unread,Sep 13, 2012, 2:32:38 AM9/13/12You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to pytho...@python.org
月忧茗 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