Common LISP-style closures with Python
Antti J Ylikoski
antti.ylikoski at tkk.fi
Sat Feb 4 23:19:40 EST 2012
On 5.2.2012 3:31, John O'Hagan wrote:
> On Sat, 04 Feb 2012 02:27:56 +0200
> Antti J Ylikoski<antti.ylikoski at tkk.fi> wrote:
>
> [...]
>
>
>>
>> # Make a Common LISP-like closure with Python.
>> #
>> # Antti J Ylikoski 02-03-2012.
>>
>> def f1():
>> n = 0
>> def f2():
>> nonlocal n
>> n += 1
>> return n
>> return f2
>>
>
> [...]
>
>>
>> i. e. we can have several functions with private local states which
>> are kept between function calls, in other words we can have Common
>> LISP-like closures.
>>
>
> I'm not sure how naughty this is, but the same thing can be done without using
> nonlocal by storing the local state as an attribute of the enclosed function
> object:
>
>>>> def f():
> ... def g():
> ... g.count += 1
> ... return g.count
> ... g.count = 0
> ... return g
> ...
>>>> h = f()
>>>> j = f()
>>>> h()
> 1
>>>> h()
> 2
>>>> h()
> 3
>>>> j()
> 1
>>>> j()
> 2
>>>> j()
> 3
>
> This way, you can also write to the attribute:
>
>>>> j.count = 0
>>>> j()
> 1
>
>
> John
Yes, I do know that, but then it would not be a closure :-)))))))))
Andy
More information about the Python-list
mailing list