Gordon McMillan wrote:
Two of them appear to rely on an implementation detail - that __path__ (only defined for imp.PKG_DIRECTORY's) will be followed even in a plain module.
AFAIK, that's not an implementation detail, but a documented way of finding out whether a module is a package or not.
Correct. But stuffing a __path__ attribute into a module does *not* make the module a package.
'''Whenever a submodule of a package is loaded, Python makes sure that the package itself is loaded first, loading its __init__.py file if necessary.'''
'''Once loaded, the difference between a package and a module is minimal.'''
Hmm, I know that Python itself uses __path__ to tell whether it has a package or not, so I don't see why a module can't be regarded as package. Moving the module into a directory of the same name and then renaming it to __init__.py has the same effect. And in that case, hacking __path__ is perfectly legal.
But it works (tm) :-)
For a sufficiently short-sighted definition of "work".
You haven't commented on the sys.modules trick yet. This one doesn't even use the __path__ hackery :-)
DateTime.py: import sys import mx.DateTime sys.modules[__name__] = mx.DateTime
Python 2.1.3 (#1, May 16 2002, 18:59:26)
import DateTime DateTime.now()
<DateTime object for '2002-07-14 19:51:03.34' at 82307a0>
<module 'mx.DateTime' from '/home/lemburg/projects/mx/DateTime/__init__.py'>
from mx import DateTime id(DateTime)
See: it's the same module :-)