Modifying func_closure
Peter Otten
__peter__ at web.de
Mon Jul 12 12:44:40 EDT 2004
Ville Vainio wrote:
>>>>>> "Peter" == Peter Otten <__peter__ at web.de> writes:
>
> Peter> Now let's change the misleading name 'self' into 'outer':
>
> --------------
>
> class Bunch:
> def __init__(self, kw):
> self.__dict__.update(kw)
>
>
> def make(a):
> c = 33
> outer = Bunch(locals())
> def update(self, delta):
> outer.a += delta
> return outer.c, outer.a
> return update
>
> class Foo:
> update = make(20)
>
> print Foo().update(99)
>
> --------------
>
> Peter> There you are.
>
> Nice hack. Put it somewhere, if it's not somewhere already :-).
It's a small step from the ubiquitous list to the more readable Bunch, so I
expect others have been there before.
> Any way to make the 'outer' class really access the locals of the
> function, so that every closure produced by the function (if it didn't
> return it, but exposed it e.g. by passing it as an argument to
> something) would refer to the real variables in function? The Bunch
> approach takes a copy, so if you manipulate locals after instantiate
> the closure the manipulations would not be visible to the closure.
Nothing that I know of. With the globals() dictionary you could do
class Bunch:
def __init__(self, d):
self.__dict__ = d
# ...
outer = Bunch(globals())
# ...
but this doesn't work with locals() which seem to be a snapshot:
>>> def f():
... d = locals()
... print d
...
>>> f()
{} # no 'd'
Peter
More information about the Python-list
mailing list