与模块同名的函数的包导入导致相对导入重影

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

我有一个包 foo_package 是这样组织的:

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

模块 bar.py 定义了一个 'public' 函数也命名为 bar,并且模块和函数都受益于完全命名为 barbar.py 还定义了一些 'private' 辅助函数。

__init__.py 内部,我对 bar.bar 进行了顶级导入,这样 foo_package.bar 将成为整个包的 API。

# __init__.py:
from .bar import bar

但现在我被相对进口咬伤了。

首先,如果我正在调试或在像 IPython 这样的交互式提示中工作,天真地粘贴 from .bar import bar 是行不通的。我可以通过在 foo_package 中启动 IPython 并改用 from foo_package import bar 来解决这个问题。

但是我怎样才能导入 bar 模块 而不是导出的 bar 函数呢?例如。

的变体
from foo_package import bar
import foo_package.bar as bar

等,全部导入函数 bar,同时任何时候bar.py也包含对另一个模块的相对导入,例如

# inside bar.py
from .baz import helper_function

那么平淡

import bar

也不行。

bar模块的包级'ghosting'和bar函数是正确的行为。如何在本地开发中(尤其是在像 IPython 这样的交互式环境中)导入 bar 模块 的同时维护它?

如果您确实有令人信服的理由保留阴影,您可以通过 sys.modules:

访问模块对象
import sys
import foo_package.bar

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

还有importlib.import_module:

import importlib

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