On Mon, Feb 11, 2013 at 8:27 PM, Oscar Benjamin <oscar.j.benja...@gmail.com>wrote:
> On 11 February 2013 06:50, Isaac To <isaac...@gmail.com> wrote: > > Except one thing: it doesn't really work. If I `import foo.baz.mymod` > now, > > and if in "bar.baz.mymod" there is a statement `import bar.baz.depmod`, > then > > it fails. It correctly load the file "bar/baz/depmod.py", and it assigns > > the resulting module to the package object bar.baz as the "depmod" > variable. > > But it fails to assign the module object of "mymod" into the "bar.baz" > > module. So after `import foo.baz.mymod`, `foo.baz.mymod` results in an > > AttributeError saying 'module' object has no attribute 'mymod'. The > natural > > `import bar.baz.mymod` is not affected. > > My guess is that you have two copies of the module object bar.baz with > one under the name foo.baz and the other under the name bar.baz. mymod > is inserted at bar.baz but not at foo.baz. I think a solution in this > case would be to have your foo/__init__.py also import the subpackage > 'bar.baz' and give it both names in sys.modules: > > import bar.baz > sys.modules['foo.baz'] = bar.baz > Thanks for the suggestion. It is indeed attractive if I need only to pre-import all the subpackage and not to redirect individual modules. On the other hand, when I actually try this I found that it doesn't really work as intended. What I actually wrote is, as foo/__init__.py: import sys import bar import bar.baz sys.modules['foo.baz'] = bar.baz sys.modules['foo'] = bar One funny effect I get is this: >>> import bar.baz.mymod >>> bar.baz.mymod <module 'bar.baz.mymod' from 'bar/baz/mymod.pyc'> >>> import foo.baz.mymod >>> bar.baz.mymod <module 'foo.baz.mymod' from 'bar/baz/mymod.pyc'> By importing foo.baz.mymod, I change the name of the module from "bar.baz.mymod" to "foo.baz.mymod". If that is not bad enough, I also see this: >>> import bar.baz.mymod as bbm >>> import foo.baz.mymod as fbm >>> bbm is fbm False Both effects are there even if bar/baz/mymod.py no longer `import bar.baz.depmod`. It looks to me that package imports are so magical that I shouldn't do anything funny to it, as anything that seems to work might bite me a few minutes later. Regards, Isaac
-- http://mail.python.org/mailman/listinfo/python-list