Writing func_closure?
Michael Hoffman
cam.ac.uk at mh391.invalid
Wed Jun 8 04:37:26 EDT 2005
Fernando Perez wrote:
> I am trying to do a run-time modification of a function's closure,
> where I want to modify the value of one of the variables in the closure.
Out of curiosity, why?
> In [21]: def wrap(x):
> ....: def f(y):
> ....: return x+y
> ....: return f
> ....:
>
> In [22]: f1=wrap('hello')
>
> In [23]: f1.func_closure
> Out[23]: (<cell at 0x4168bcd4: str object at 0x41bc0080>,)
>
> My question is, how can I create one of these cell objects to stuff into the
> closure (I want to do this from pure Python, not C extensions).
>>> f1.func_closure[0].__class__()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot create 'cell' instances
Hmmm, that didn't work so well.
>>> f1.func_closure = f1.func_closure
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: readonly attribute
Closer inspection of the docs <http://docs.python.org/ref/types.html>
reveals that it is not writable after all. Therefore the only way I can
see to do it without writing an extension is to generate some dummy
function and copy the func_closure attribute from it. Luckily, you have
already produced a factory for such a function:
>>> f1(" there")\
'hello there'
>>> _f2 = wrap("howdy")
>>> f1 = new.function(f1.func_code, f1.func_globals, f1.func_name,
f1.func_defaults, _f2.func_closure)
>>> f1(" there")
'howdy there'
Mix-and-match functions! What will they think of next?
--
Michael Hoffman
More information about the Python-list
mailing list