与模块同名的函数的包导入导致相对导入重影
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
,并且模块和函数都受益于完全命名为 bar
。 bar.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']
import importlib
bar_module = importlib.import_module('foo_package.bar')
我有一个包 foo_package
是这样组织的:
foo/
setup.py
README.md
...
foo_package/
__init__.py
bar.py
baz.py
模块 bar.py
定义了一个 'public' 函数也命名为 bar
,并且模块和函数都受益于完全命名为 bar
。 bar.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']
import importlib
bar_module = importlib.import_module('foo_package.bar')