Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #29016

Re: confused in decorate and closure

From Peter Otten <__peter__@web.de>
Subject Re: confused in decorate and closure
Date 2012-09-13 08:32 +0200
Organization None
References <CALZWPGgYJqBJF3BKw=vkYA==69-W+UWtiQyQA9Sk_UPEsmC-rQ@mail.gmail.com>
Newsgroups comp.lang.python
Message-ID <mailman.594.1347517951.27098.python-list@python.org> (permalink)

Show all headers | View raw


月忧茗 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

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: confused in decorate and closure Peter Otten <__peter__@web.de> - 2012-09-13 08:32 +0200

csiph-web