前言

在Python开发过程中,尤其是在大型项目中,我们经常会遇到模块间相互依赖的情况。这种相互依赖,即所谓的“循环引用”,往往会导致代码难以维护,并可能引发各种运行时问题。在这篇博客中,我们将探讨Python中循环引用的问题,并提供一些有效的解决方案。

问题

循环引用通常发生在两个或多个模块互相导入对方的情况下。例如,模块A导入模块B,同时模块B也导入模块A。这种情况下,如果不妥善处理,可能会导致程序在运行时遇到导入错误或者初始化失败的问题。

解决办法

  1. 局部导入
    最简单且常用的方法是将导入语句放在函数或方法内部。这种做法可以延迟导入的过程,直到函数被调用时才进行,从而避免初始化时的循环依赖。

    说实在话,我是真没想到解决办法竟然如此简单!!!请让我们谢谢ChatGPT!

    # 在module1.py
    def func1():
    from module2 import func2
    # 使用 func2 # 在module2.py
    def func2():
    from module1 import func1
    # 使用 func1
  2. 重构代码结构
    通过重新组织代码,将相互依赖的部分放入同一个模块中,或者创建一个新的模块来存放共享的代码部分。

  3. 延迟类型注解(Python 3.7+)
    对于类型注解中的循环依赖,使用 from __future__ import annotations 可以延迟类型注解的评估。

  4. 使用接口或抽象类
    定义接口或抽象基类,并在一个模块中实现这些接口,而在另一个模块中引用,可以减少直接的模块依赖。

  5. 依赖注入
    将需要的对象或函数作为参数传递给函数或类,而非直接在模块层面导入。

结束语

循环引用是Python项目中常见的一个问题,但通过上述方法,我们可以有效地解决或绕过这一难题。值得注意的是,虽然局部导入是一个快速解决问题的办法,但从长远来看,重构代码以消除循环依赖通常是更健康和可持续的解决方案。希望这篇博客能帮助你在Python项目中更好地处理模块间的依赖关系!

ps: 我最初采用了局部导入的方式,但是发现还是有解决不了的问题(比如局部导入后该导入又被其他文件在其他地方引用,总之就是极其复杂)。最后小小地重新整理了一下代码。我的做法是这样的:

  1. 对于多个文件需要共享的内容,使用全局变量globs.py。
  2. 然后将处理全局变量的函数抽出来作为一个文件utils.py。
  3. 其他文件调用utils.py文件,而utils.py只调用全局变量globs.py。这样就不会出现循环依赖的问题。

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_46106285/article/details/135348198。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

【记录】Python3|Python出现循环引用模块怎么办?(又称循环依赖)的更多相关文章

  1. 第二十一天python3 python的正则表达式re模块学习

    python的正则表达式 python使用re模块提供了正则表达式处理的能力: 常量 re.M re.MULTILINE 多行模式 re.S re.DOTALL 单行模式 re.I re.IGNORE ...

  2. 2211-22学习记录之python百分数,time模块

    百分数 print(' {:.0%}'.format(84/100)) 输出为84% 以上百分数输出是使用到了字符串格式化函数format(),在其中将分数42/50作为值给传递了进去.如果将分子分母 ...

  3. 使用gc、objgraph干掉python内存泄露与循环引用!

    Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...

  4. Python对象的循环引用问题

    目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...

  5. Spring 循环引用(二)源码分析

    Spring 循环引用(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环引用相关文章: & ...

  6. ios - block循环引用Demo示例

    当实例变量中有了block属性,并且用copy来修饰,但是当调用block中的代码的时候,如果block中运用了self.属性的时候回造成循环引用. // // ViewController.h // ...

  7. block使用小结、在arc中使用block、如何防止循环引用

    引言 使用block已经有一段时间了,感觉自己了解的还行,但是几天前看到CocoaChina上一个关于block的小测试主题: [小测试]你真的知道blocks在Objective-C中是怎么工作的吗 ...

  8. Atitit.json xml 序列化循环引用解决方案json

    Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...

  9. Samples DataBind FastJson循环引用问题

    Fastjson full support databind, it's simple to use. Encode import com.alibaba.fastjson.JSON; Group g ...

  10. 小结OC中Retain cycle(循环引用)

    retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于 ...

随机推荐

  1. Linux驱动---LED

    目录 一.pinctrl子系统 二.GPIO子系统 三.GPIO操作步骤 3.1.获取GPIO描述符 3.2.设置方向 3.3.读写值 四.编写LED驱动 4.1.硬件原理图 4.2.修改设备树 4. ...

  2. Docker 持续集成部署+ELK日志相关等 完美实践

    docker(ubuntu) 卸载docker # 卸载(如有) for pkg in docker.io docker-doc docker-compose docker-compose-v2 po ...

  3. axios 发送 form-data 请求和 x-www-form-urlencoded请求以及相关问题

    问题 not supported { "msg": "Content type 'multipart/form-data;boundary=--------------- ...

  4. QT5笔记: 28. SplashWindow 没听懂,无内容

    没有说明这个SplashWindow咋用 大概小人愚笨 this->setWindowFlag(Qt::SplashScreen);莫非是这个?

  5. Ubuntu详细的安装和配置ssh教程

    Ubuntu安装和配置ssh的步骤如下: 打开终端,输入以下命令安装ssh: sudo apt-get install openssh-server 安装完成后,启动ssh服务: sudo syste ...

  6. Java进阶 - [1-5] 集合容器

    ArrayList add 1.先确认是否需要扩容,如果需要,则进行扩容操作ensureExplicitCapacity. 2.进行赋值 elementData[size++] = e; 扩容 1.如 ...

  7. 读论文-顺序推荐系统_挑战、进展和前景(Sequential recommender systems_ challenges, progress and prospects)

    前言 今天读的论文为一篇于2019年发表的论文,是关于顺序推荐系统(Sequential Recommender Systems,SRSs)的研究,作者对SRSs的挑战.进展和前景进行了系统综述. 要 ...

  8. 如何学好.net core?

    https://www.zhihu.com/question/348740859/answer/842656513

  9. C# 一般处理程序ashx用于验证码

    1.用VS2019建立一个web应用程序,选mvc模板 2.选中项目邮件新建文件夹Webservice,然后添加一般处理程序Verify.ashx然后右键打开改写如下 1 public class V ...

  10. 【EX6-1】带孔平板拉伸的弹塑性分析

    带孔平板拉伸的弹塑性分析 来源:<ABAQUS有限元分析实例详解>石亦平等 1. 建模 塑性数据: abaqus输入塑性数据见ABAQUS弹塑性分析 网格划分: 2. 分析设置 单元类型设 ...