closure = decorator?

Franck Ditter nobody at nowhere.org
Fri Oct 11 08:08:57 EDT 2013


In article <5257c3dd$0$29984$c3e8da3$5496439d at news.astraweb.com>,
 Steven D'Aprano <steve+comp.lang.python at pearwood.info> wrote:

> On Fri, 11 Oct 2013 10:14:29 +0300, Jussi Piitulainen wrote:
> 
> > Roy Smith writes:
> >> In article <m2a9ihxf3a.fsf at cochabamba.vanoostrum.org>,
> >>  Piet van Oostrum wrote:
> >> 
> >> > I usually say that a closure is a package, containing a function with
> >> > some additional data it needs. The data usually is in the form of
> >> > name bindings.
> >> 
> >> That's pretty close to the way I think about it.  The way it was
> >> originally described to me is, "A closure is a function bundled up with
> >> it's arguments".
> > 
> > Really? It should be more like "a function bundled up with some other
> > function's arguments" and even more like "a function bundled up with
> > bindings for its free variables".
> 
> Closures have nothing to do with *arguments*. A better definition of a 
> closure is that it is a function together with a snapshot of the 
> environment it was called from.
> 
> def func(arg):
>     y = arg + 1
>     def inner():
>         return y + 1000
>     return inner
> 
> f = func(1)

Maybe a better example of closure would be (just for the nonlocal) :

def fib() :
    (a,b) = (0,1)
    def producer() :
        nonlocal a,b     # Python 3
        old = a
        (a,b) = (b,a+b)
        return old
    return producer

>>> f = fib()
>>> [f() for i in range(10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

> At this point, f is a closure. It needs to know the value of y (not the 
> argument to func) in order to work, and the implementation is to store 
> that information inside f.func_closure (or f.__closure__ in Python 3). 
> The part of the calling environment which is saved is y

Shouldn't it be the (a,b) pair here ? But :

>>> f.__closure__[0].cell_contents    # access to what ?
55

Shouldn't cell_contents keep the current (a,b) pair, a part of the snapshot of
the creation environment (private variables of the closure) ? 
Instead it seems to returns only a (which is the next production)...

    franck



More information about the Python-list mailing list