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

有两个模块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:直接导入模块名,通过模块调用其中的函数

#moduleA
import 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

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

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

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

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

    1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出 ...

  3. python 调用pymysql模块遇到\转义问题解决办法

    1.问题情况 本来存入mysql的是字典,有汉字,由于python版本是2.7,所以在json的时候把我的值变成了unicode,那么在调用pymysql的时候,mysql给我转义取消了. 存之前: ...

  4. nodejs模块循环引用讲解

    CommonJS 模块的重要特性是加载时执行,即脚本代码在require的时候,就会全部执行.一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出. 让我 ...

  5. python中模块的引用

    一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代 ...

  6. NRF51822模块无法识别问题解决办法

    我知道没图是没人看的,所以随便瞎截图了几张. 对于很多新手朋友们,或许可能还不是很了解jtag相关的一些调试所需的必须电路,就像很多人不喜欢用stm32的硬件i2c,而是喜欢软件io模拟,就算是使用了 ...

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

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

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

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

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

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

随机推荐

  1. Maven 仓库之阿里云镜像配置

    每当项目开发中 update Maven Project 的时候,我们会发现那个进度是非常的慢,这也严重阻碍了平日的开发进度.        然而,殊不知阿里云搭建了一个国内镜像 http://mav ...

  2. POJ - 1743 后缀自动机

    POJ - 1743 顺着原字符串找到所有叶子节点,然后自下而上更新,每个节点right的最左和最右,然后求出答案. #include<cstdio> #include<cstrin ...

  3. 微信公众号第三方平台生成自定义菜单提示 获取"access_token失败"

    在微信公众号第三方平台要生成自定义菜单时,程序反应很慢,最终提示"获取access_token失败"(之前程序无改动,使用时间已久),查了大半天,找不出原因. 排除.在微信公众号平 ...

  4. poj1258 Agri-Net(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1258 题意 有n个农场,现在要在n个农场之间铺设光纤使得n个农场连接起来,求铺设光纤的最短距离. 思路 最小生成树问题,使用Prime ...

  5. 21:包含min函数的栈

    import java.util.Stack; /** * 面试题21:包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. */ public class ...

  6. php 生成二维码(qrcode)

    可以用composer安装 https://packagist.org/packages/endroid/qrcode

  7. TCP、UDP、HTTP、SOCKET之间的区别与联系

    IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...

  8. 《Android源码设计模式》--抽象工厂模式

    No1: 4种MediaPlayer Factory分别会生成不同的MediaPlayer基类:StagefrightPlayer.NuPlayerDriver.MidiFile和TestPlayer ...

  9. Windows 修改电脑属性(二)

    一.秀出自我风格的屏幕保护画面 1.气泡屏幕保护 打开电脑,按开始键,点击运行输入regedit按回车键进入注册表界面,找到如下路径:HKEY_CURRENT_USER/Software/Micros ...

  10. python3.6.5中pip3无法使用

    1.在python命令行窗口中: python3 -m ensurepip 创建出pip3.exe.2.再在python3.6的安装目录下的Scripts路径下命令行 pip3 install XXX ...