When a higher order function returns a new function, a new context has been wrapped around the existing code object. The code of that function is created once, at compile time. There is absolutely no compiler involved at runtime, no new byte code is generated.
>>> def foo(n):
... def bar():
... print n
... return bar
...
>>> a,b = foo(1), foo(2)
>>> a == b
False
>>> a()
1
>>> b()
2
>>> a.__code__ == b.__code__
True
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.
Sunday, May 29, 2011
Wednesday, May 18, 2011
__class__ is special
>>> class Classless(object):
... def __getattr__(self, name): raise AttributeError(name)
...
>>> Classless().__class__
<class '__main__.Classless'>
>>> c = Classless()
>>> c.__class__ = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ must be set to new-style class, not 'NoneType' object
... def __getattr__(self, name): raise AttributeError(name)
...
>>> Classless().__class__
<class '__main__.Classless'>
>>> c = Classless()
>>> c.__class__ = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ must be set to new-style class, not 'NoneType' object
Monday, May 16, 2011
the keys to the kingdom
Most of the low-level guts of an operating system are only exposed to C. Enter ctypes, part of the python standard library which allows python to call C code natively.
For example, say you are trying to access some function of open-ssl that is not exposed through the ssl module.
>>> import ctypes
>>> libssl = ctypes.cdll.LoadLibrary('libssl.so')
>>> libssl.PEM_read_bio_PrivateKey
<_FuncPtr object at 0x7fc001ba3a10>
With ctypes, your code is a full peer of C/C++ in how it can interact with the OS.
For example, say you are trying to access some function of open-ssl that is not exposed through the ssl module.
>>> import ctypes
>>> libssl = ctypes.cdll.LoadLibrary('libssl.so')
>>> libssl.PEM_read_bio_PrivateKey
<_FuncPtr object at 0x7fc001ba3a10>
Thursday, May 5, 2011
reloading a module does not regenerate the module object
When a module is reloaded, the module object is not removed from memory. Old data which is not overwritten will stick around.
>>> import json
>>> oldjson = json
>>> reload(json)
<module 'json' from 'C:\Python26\lib\json\__init__.pyc'>
>>> json is oldjson
True
To truly clean up modules in memory is a tricky process.
>>> import json
>>> oldjson = json
>>> reload(json)
<module 'json' from 'C:\Python26\lib\json\__init__.pyc'>
>>> json is oldjson
True
To truly clean up modules in memory is a tricky process.
Subscribe to:
Posts (Atom)