Python 的循环引入问题

循环引入限制主要是为了避免初始化顺序的不确定性语义混淆

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  # 模块间循环引入

常见的解决方案

  1. 延迟导入
python 复制代码
# 在函数内部导入
def some_function():
    from module_b import other_function
    return other_function()
  1. 重构代码结构
python 复制代码
# 将共同依赖提取到第三个模块
# common.py
def shared_function():
    pass

# module_a.py
from common import shared_function

# module_b.py  
from common import shared_function
  1. 使用 importlib
python 复制代码
import importlib

def get_module():
    return importlib.import_module('module_name')

所以总结来说,循环引入是模块之间的问题,不是包级别的概念。包只是模块的容器和组织方式。

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
二十雨辰3 小时前
[爬虫]-Urllib
爬虫·python
玉鸯5 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_446260855 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao6 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
qetfw6 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
用户8356290780517 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
一次旅行7 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化