假设我有一个模块 rules
具有以下结构:
rules
├── conditions.py
├── __init__.py
在脚本 conditions.py
中,我想导入一个名为 RuleParserError
定义在 __init__.py
中的类。但是,我一直无法弄清楚如何做到这一点。 (以下 Python:如何从 init.py 文件导入? 我试过了
from . import RuleParserError
但这会导致 ImportError: cannot import name RuleParserError
尝试运行 conditions.py
as __main__
)。
原文由 Kurt Peek 发布,翻译遵循 CC BY-SA 4.0 许可协议
我将“从父模块导入”视为 Python 中的反模式。进口应该是相反的。从模块的
__init__.py
导入尤其有问题。正如您所注意到的,从foo/bar.py
导入模块foo.bar
--- 涉及导入foo/__init__.py
首先,你可能会以循环依赖告终。添加print("Importing", __name__)
到您的 init 文件有助于查看序列并理解问题。我建议您将要在
conditions.py
中导入的代码从__init__.py
移动到一个单独的较低级别的模块,然后只需从该模块中导入一些名称__init__.py
在更高层次上揭露它。假设您的
class Bar
__init__.py
。我会按照以下方式重新组织它。__init__.py
:bar.py
:conditions.py
:理想情况下,
__init__.py
应该只包含从较低级别模块导入的内容,或者什么也不包含。