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:直接导入模块名,通过模块调用其中的函数
#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各个模块循环引用问题解决办法的更多相关文章
- Python对象的循环引用问题
目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...
- EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
1.在使用EF时,由于数据库主外键关联,将对象进行Json序列化时会遇到循环引用的问题 //EF 中由于数据库主外键关联,对象的序列化经常出现循环引用问题 //使用.Net 自带的序列化工具,序列化出 ...
- python 调用pymysql模块遇到\转义问题解决办法
1.问题情况 本来存入mysql的是字典,有汉字,由于python版本是2.7,所以在json的时候把我的值变成了unicode,那么在调用pymysql的时候,mysql给我转义取消了. 存之前: ...
- nodejs模块循环引用讲解
CommonJS 模块的重要特性是加载时执行,即脚本代码在require的时候,就会全部执行.一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出. 让我 ...
- python中模块的引用
一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代 ...
- NRF51822模块无法识别问题解决办法
我知道没图是没人看的,所以随便瞎截图了几张. 对于很多新手朋友们,或许可能还不是很了解jtag相关的一些调试所需的必须电路,就像很多人不喜欢用stm32的硬件i2c,而是喜欢软件io模拟,就算是使用了 ...
- 使用gc、objgraph干掉python内存泄露与循环引用!
Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...
- 小结OC中Retain cycle(循环引用)
retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于 ...
- swift详解之九---------------自动引用计数、循环引用
自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...
随机推荐
- codeforces 286 E. Ladies' Shop (FFT)
E. Ladies' Shop time limit per test 8 seconds memory limit per test 256 megabytes input standard inp ...
- bzoj [SDOI2009]学校食堂Dining
感觉这个状压dp比较难想.. dp[ i ][ s ][ k ] 表示前i - 1个都排好了, 从i开始的7个的取没取的状态为s, 且最后一个相对i的位置为k的最少花费. 状态转移方程 if(s &a ...
- Excel快速数据处理
年底各位领导都要统计各种报表数据,Excel技能捉襟见肘啊! 同一xlsx文件下同一Sheet下的数据引用 同一xlsx文件下不同Sheet下的数据引用 同一文件夹下的不同xlsx文件下的数据引用 不 ...
- kylin加载hive表错误:ERROR [http-bio-7070-exec-10] controller.TableController:189 : org/apache/hadoop/hive/conf/HiveConf java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法
一.问题背景 在kylin中加载hive表时,弹出提示框,内容是“oops!org/apache/hadoop/hive/conf/HiveConf”,无法加载hive表,查找kylin的日志时发现, ...
- 实现linux和windows文件传输
其实这个题目有点大,这里介绍的只是linux和windows文件传输中的一种,但是这种方法却非常实用,那就是:ZModem协议具体是linux命令是:rz和sz但是其实它们是两个非常方便的工具. ...
- js javascript 实现多线程
在讲之前,大家都知道js是基于单线程的,而这个线程就是浏览器的js引擎. 首先来看一下大家用的浏览器都具有那些线程吧. 假如我们要执行一些耗时的操作,比如加载一张很大的图片,我们可能需要一个进度条来让 ...
- Spark入门2(Spark简析)
一.Spark核心概念-RDD RDD是弹性分布式数据集,一个RDD由多个partition构成,一个partition对应一个task.RDD的操作分为两种:Trasformation(把一个RDD ...
- JAVAEE——SSH项目实战06:统计信息管理、Spring注解开发和EasyUI
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7190925.html 一.统计信息管理 二.Spring注解开发 1.service ...
- python获取文件属性
提供三段代码 1.os模块 import os def TestFileAttributes(): # This function is platform indepedent. statinfo = ...
- CentOS7配置ssh证书登录无效
今天配置A服务器使用root用户ssh免密登录服务器B,配置过程很简单,由于这两台服务器开发人员之前生成过证书,我就直接在A服务器执行如下命令即可 # ssh-copy-id -i ~/.ssh/id ...