python各个模块循环引用问题解决办法

当项目中的模块过多,或功能划分不够清晰时会出现循环引用的问题,如下

有两个模块moduleA 和 moduleB:

#moduleA
from moduleB import b

def a():
    print ‘aaaaaaaa‘
    b()

def c():
    print ‘cccc‘

if __name__ == ‘__main__‘:
    a()

#moduleB
from moduleA import c

def b():
    print ‘bbbbbbbbbb‘
    c()

这种情况下就会出现以下的错误 :

Traceback (most recent call last):
  File "D:/PycharmProjects/untitled2/moduleA.py", line 1, in <module>
    from moduleB import b
  File "D:\PycharmProjects\untitled2\moduleB.py", line 2, in <module>
    from moduleA import c
  File "D:\PycharmProjects\untitled2\moduleA.py", line 1, in <module>
    from moduleB import b
ImportError: cannot import name b

这就是循环引用导致的

导入的实质

导入其实是要将 被导入模块所有的顶格代码都执行一遍,遇到函数和类的定义会作申明。

如果b模块中有这么一句

print ‘bbb‘

你在a模块impot b时就会 执行 print ‘bbb‘这一句。

回到循环引用中,首先导入B,进入B中,发现B中又导入了A又回到A中,但是A又导入B这就形成了循环引用。

解法1:直接导入模块名,通过模块调用其中的函数

#moduleAimport moduleB

def a():
    print ‘aaaaaaaa‘
    moduleB.b()
def c():
    print ‘cccccc‘

if __name__ == ‘__main__‘:
    a()

*************************************
#moduleB
import moduleA

def b():
    print ‘bbbbbbbbbb‘

    moduleA.c()

具体原因我也不太清楚。

解法2:使用延迟导入(lazy import)

在需要用的函数内部导入,或是在底部导入

moduleB
***************
def b():
    print ‘bbbbbbbbbb‘

    c()

from moduleA import c

**************************
或者
def b():
    from moduleA import c
    print ‘bbbbbbbbbb‘
    c()

解法3:重新设计代码结构,将代码和并或者分离

这个要看情况 而定了,将公共功能的代码分离成单独模块,或者将一些具有关系的代码合并成一个模块。

来源:https://www.jianshu.com/p/a1e91cc53b07

原文地址:https://www.cnblogs.com/shengulong/p/10140225.html

时间: 2024-08-29 11:38:13

python各个模块循环引用问题解决办法的相关文章

Python语言中循环引用(import)失败的解决方案

最近在开发智能家居项目hestia-rpi项目中,由于代码结构层级划分不合理,导致了循环引用(import)module失败的问题,错误如下: 1 2 3 4 5 6 7 8 9 10 Traceback (most recent call last):   File "./main.py", line 8, in &amp;lt;module&amp;gt;     from hestiarpi.library.server import server   File

Python对象的循环引用问题

目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 python关于GC的模块 gc.set_debug()(可以查看垃圾回收的信息,进而优化程序) gc.collect() gc.disable() Python对象循环引用 我们来介绍一下 Python 是采用何种途径解决循环引用问题的. 循环引用垃圾回收算法 上图中,表示的是对象之间的引用关系,从自对

EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json

1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出现循环引用问题 List<student> list = _Context.students.ToList(); JavaScriptSerializer ser = new JavaScriptSerializer(); string str = ser.Serialize(list); Con

python中模块的引用

一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂.模块能定义函数,类和变量,模块里也能包含可执行的代码 目的 提高复用性 用法 1) import 模块名 注意:如果模块名里有个类,必须实例化类才能调用类里的方法:模块名.类名().方法 2) from 模块名 import 对应的类或者函数(一般是调用

shiro+spring boot+mybatis启动循环引用问题解决思路和方案

启动报错:Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference? 翻译过来的意思就是:创建bean"dataSource"报错:需要的bean正在被创建:是否有一个没解决的循环依赖? 更通俗点的解释就是:因为循环依赖的问题导致"dataSource"这个bean无法

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

Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问题:内存泄露与循环引用.内存泄露是让所有程序员都闻风丧胆的问题,轻则导致程序运行速度减慢,重则导致程序崩溃:而循环引用是使用了引用计数的数据结构.编程语言都需要解决的问题.本文揭晓这两个问题在python语言中是如何存在的,然后试图利用gc模块和objgraph来解决这两个问题. 注意:本文的目标是Cpyth

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

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在 Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个 对象的内存计数加1,反之,当我们调用rel

swift详解之九---------------自动引用计数、循环引用

自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 为了确保在

OC中常见的循环引用总结

定义:循环引用可以简单理解为A引用了B,而B又引用了A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放: 造成循环引用的三种情况 计时器NSTimer 原因分析: NSTimer变量通过target对xxxModel有强引用,NSTimer变量是xxxModel内部的成员变量,所以xxxModel对该成员变量有强引用  解决办法: 提供类似cleanTimer的公开方法,让外界主动调用释放NSTimer变量 block 原因分析: 某个类将block作为自己的属性变量,