当前位置: 首页 > news >正文

Python 模块加载机制导致的问题

Python 在导入模块时,会执行模块中的代码。当存在互相依赖(循环依赖)时,如果在模块顶层进行导入,可能会出现问题。因为在一个模块还未完全加载和初始化时,另一个模块就尝试导入它,这可能会导致某些对象或属性还未定义。

module_a.py

from module_b import B

class A:
    def __init__(self):
        self.b = B()

a = A()

module_b.py

from module_a import A

class B:
    def __init__(self):
        self.a = A()

b = B()

当 Python 解释器执行 import module_a 时,会先执行 module_a.py 中的代码。在执行到 from module_b import B 时,会去加载 module_b.py。而 module_b.py 中又有 from module_a import A,此时 module_a 还未完全加载完毕,A 类可能还未定义,就会导致循环依赖错误。

函数内导入的延迟加载特性
将导入语句放在函数内部,导入操作会延迟到函数被调用时才执行。这样就避免了在模块加载阶段就出现循环依赖的问题。

module_a.py

class A:
    def __init__(self):
        from module_b import B
        self.b = B()

a = A()

module_b.py

class B:
    def __init__(self):
        from module_a import A
        self.a = A()

b = B()

在这个修改后的例子中,当 module_a.py 被加载时,并不会立即执行 from module_b import B,而是在 A 类的 init 方法被调用时才执行。同理,module_b.py 中的导入操作也是延迟执行的。这样,每个模块在加载时都不会尝试去导入还未完全加载的模块,从而避免了循环依赖问题

注意事项

虽然将导入语句放在函数内部可以解决循环依赖问题,但这可能会影响代码的可读性和性能。因为每次调用函数时都会执行导入操作,可能会带来一些额外的开销。更好的做法是重构代码,避免循环依赖的产生。

pydeps

https://knowledge.zhaoweiguo.com/build/html/lang/pythons/tools/code_analysis/pydeps
https://pypi.org/project/pydeps/

brew install graphviz
pip install pydeps
pydeps xx.py --show-deps

会用图的方式检测出互相依赖

http://www.dtcms.com/a/20694.html

相关文章:

  • 146,[1] BUUCTF WEB [SWPU2019]Web1
  • Python的imutils库详细介绍
  • Linux(socket网络编程)UDP---初学
  • nacos学习笔记
  • DeepSeek-R1:通过强化学习激励大型语言模型的推理能力
  • 【LeetCode】3.无重复字符的最长字串
  • Qt中基于开源库QRencode生成二维码(附工程源码链接)
  • Mac 开发工具推荐
  • 《云原生安全攻防》-- K8s镜像安全:镜像全生命周期安全管理
  • 深入解析类方法与静态方法 —— 内存分析与直观图示详解
  • 项目访问出现504 Gateway Time-out nginx/1.21.6的情况
  • 注册表单提交加验证码功能
  • 服务器租用:虚拟化技术都包含哪些内容?
  • 2025年2月9日(数据分析_2)
  • Spring AI发布!让Java紧跟AI赛道!
  • ailx10的发明专利思路
  • HDFS体系结构
  • 【深度学习】深度学习和强化学习算法——深度 Q 网络DQN
  • 【SQL SERVER】sqlserver 该表字段如果被用作其他表的外键不能被truncate table
  • 掌握xtquant实时行情订阅:量化交易的关键一步
  • 强化学习笔记7——DDPG到TD3
  • 速度与激情:4.5吨轻卡阻力与刹车力模型的终极拆解——从仿真台架到真实路况的硬核对话
  • 2025年2月16日(numpy-deepseek)
  • 【云原生】SpringCloud-Spring Boot Starter使用测试
  • Spring源码分析のBean创建流程(上)
  • OpenCV简介
  • 用命令模式设计一个JSBridge用于JavaScript与Android交互通信
  • Python —— format函数的使用
  • Copilot in OneNote(WebTeams)功能提升效率加倍
  • open3d绘制平面