closure = decorator?

Terry Reedy tjreedy at udel.edu
Fri Oct 11 16:55:33 EDT 2013


On 10/11/2013 8:08 AM, Franck Ditter wrote:
> 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)

     a,b = 0,1 is the same thing.

a and b are separate local names and are in no sense a 'pair'.

>      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)...

Look as f.__closure__[1] (.cell_contents) for b.

-- 
Terry Jan Reedy




More information about the Python-list mailing list