0

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

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

该模块bar.py定义了一个同样命名的“公共”函数bar,并且模块和函数都从准确命名中受益匪浅barbar.py还定义了一些“私有”辅助函数。

在里面__init__.py我做了一个顶级导入,bar.bar所以这foo_package.bar将是整个包的 API。

# __init__.py:
from .bar import bar

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

首先,如果我正在调试或在 IPython 之类的交互式提示中工作,那么天真的粘贴from .bar import bar是行不通的。我可以通过在内部启动 IPythonfoo_package并改为使用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 的模块的包级“重影”是正确的行为。在本地开发中(尤其是在像 IPython 这样的交互式环境中)导入模块的同时,我该如何维护这一点?bar bar

4

1 回答 1

1

如果您确实有一个令人信服的理由来保留阴影,您可以通过以下方式访问模块对象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')
于 2017-08-28T23:19:38.650 回答