Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Re: confused in decorate and closure (http://www.velocityreviews.com/forums/t952142-re-confused-in-decorate-and-closure.html)

Peter Otten 09-13-2012 06:32 AM

Re: confused in decorate and closure
 
月忧茗 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




All times are GMT. The time now is 07:43 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.