简体   繁体   中英

Package import of function with same name as module causing ghosting with relative imports

I have a package foo_package organized like this:

foo/
    setup.py
    README.md
    ...
    foo_package/
        __init__.py
        bar.py
        baz.py

The module bar.py defines one 'public' function also named bar , and both the module and the function benefit hugely from being named exactly bar . bar.py also defines some 'private' helper functions.

Inside of __init__.py I make a top-level import of bar.bar so that foo_package.bar will be the API of the overall package.

# __init__.py:
from .bar import bar

But now I am getting bitten by relative imports.

First, if I am debugging or working in an interactive prompt like IPython, naively pasting from .bar import bar doesn't work. I can get around this by launching IPython inside foo_package and using from foo_package import bar instead.

But then how can I import the bar module and not the exported bar function? Eg variants of

from foo_package import bar
import foo_package.bar as bar

etc., all import the function bar , meanwhile any time that bar.py also contains a relative import to another module, such as

# inside bar.py
from .baz import helper_function

then the plain

import bar

won't work either.

The package-level 'ghosting' of bar the module with bar the function is the correct behavior. How can I maintain this while also being able to import bar the module in local development (especially in an interactive environment like IPython)?

If you really do have a compelling reason to keep the shadowing, you can access the module object through sys.modules :

import sys
import foo_package.bar

bar_module = sys.modules['foo_package.bar']

There's also importlib.import_module :

import importlib

bar_module = importlib.import_module('foo_package.bar')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM