循环引入限制主要是为了避免初始化顺序的不确定性 和语义混淆
Lazy Import
在 Python 中,循环引入(circular imports)是在模块级别发生的,而不是包级别。
模块级别的循环引入
循环引入发生在两个或多个模块相互导入时:
python
# module_a.py
from module_b import some_function
def function_a():
return "From A"
# module_b.py
from module_a import function_a # 这里形成循环引入
def some_function():
return function_a()
包级别的情况
包本身不会产生循环引入,因为包主要是一个命名空间和组织结构。但是包内的模块之间可能存在循环引入:
markdown
mypackage/
├── __init__.py
├── module1.py
└── module2.py
python
# mypackage/module1.py
from mypackage.module2 import func2
# mypackage/module2.py
from mypackage.module1 import func1 # 模块间循环引入
常见的解决方案
- 延迟导入:
python
# 在函数内部导入
def some_function():
from module_b import other_function
return other_function()
- 重构代码结构:
python
# 将共同依赖提取到第三个模块
# common.py
def shared_function():
pass
# module_a.py
from common import shared_function
# module_b.py
from common import shared_function
- 使用
importlib
:
python
import importlib
def get_module():
return importlib.import_module('module_name')
所以总结来说,循环引入是模块之间的问题,不是包级别的概念。包只是模块的容器和组织方式。