Re: Import redirects

Discussion in 'Python' started by Isaac To, Feb 12, 2013.

  1. Isaac To

    Isaac To Guest

    On Mon, Feb 11, 2013 at 8:27 PM, Oscar Benjamin
    <>wrote:

    > On 11 February 2013 06:50, Isaac To <> 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
    Isaac To, Feb 12, 2013
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mark
    Replies:
    0
    Views:
    292
  2. Isaac To

    Import redirects

    Isaac To, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    105
    Isaac To
    Feb 11, 2013
  3. Mark Lawrence

    Re: Import redirects

    Mark Lawrence, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    95
    Mark Lawrence
    Feb 11, 2013
  4. Chris Angelico

    Re: Import redirects

    Chris Angelico, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    96
    Chris Angelico
    Feb 11, 2013
  5. Oscar Benjamin

    Re: Import redirects

    Oscar Benjamin, Feb 11, 2013, in forum: Python
    Replies:
    0
    Views:
    109
    Oscar Benjamin
    Feb 11, 2013
Loading...

Share This Page