Common LISP-style closures with Python

John O'Hagan research at johnohagan.com
Sun Feb 5 02:31:12 CET 2012


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



More information about the Python-list mailing list