Kind of like "hey guys, check it out you can just duct tape down the dead-man's switch on this power tool and use it one handed". In Python.
Monday, November 19, 2012
back-porting non-local
There have been discussions about back-porting the nonlocal keyword from Python 3 to Python 2.
But, is there some crazy, misguided hack we can use to edit closures in Python 2?
Let's make a closure!
>>> def foo():
... a = 2
... def bar():
... print a
... return bar
...
>>> foo().func_closure
(<cell at 0x02515FF0: int object at 0x023AA6CC>,)
A closure apparently consists of a tuple of cell objects. The tuple is immutable. What about the cell itself?
>>> foo().func_closure[0].cell_contents
2
>>> foo().func_closure[0].cell_contents = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: attribute 'cell_contents' of 'cell' objects is not writable
Well played, Python 2.7 runtime. Time to go nuclear: the python C api.
>>> b = foo()
>>> b()
2
>>> import ctypes
>>> ctypes.pythonapi.PyCell_Set(id(b.func_closure[0]), id(3))
0
>>> b()
3
So, there you have it. The contents of a closure can be changed in Python 2.
Subscribe to:
Post Comments (Atom)
Working horse riding hats and progress codes that unendingly applied at checkout.
ReplyDelete