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 -- http://mail.python.org/mailman/listinfo/python-list