专栏首页敏而好学Python模块的交叉引用(导入循环)问题分析

Python模块的交叉引用(导入循环)问题分析

    实际项目中遇到python模块相互引用问题,查资料,终于算是弄明白了。

    首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,可见我摘自《python核心编程》第二版的摘抄:Python导入循环方法

    附录给了一种解决交叉引用的方法,试了,不行,但关于交叉引用问题本身说明的很清楚,如果不清楚什么是交叉引用,可看附录一。

    循环引用在python圈关注的并不多,语言上没有提供防止循环依赖的机制。      总的来说,应该在总体结构上避免模块之间互相依赖,即:A依赖B,B就不要依赖A,这也是代码重构的一个目标。      对于紧急情况,往往来不及对代码大动。      只要找到导致循环引用的模块(最少两个),把引用关系搞清楚,把某个模块让它在真正需要的时候再导入(一般放到函数里面),或者放到代码的最后导入,这样就可以基本解决模块循环依赖的问题。 

一个小窍门:      查看循环引用的报错栈时,会找到两次导入同一个模块的文件。注意在这个附近找。

总结:

    在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。

一些比较靠谱的方法是:

        1. 把 import 语句放到方法定义的后面。

        2. 将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。

附录:

一:Python模块的交叉引用问题 解读: How can I have modules that mutually import each other? 有下面两个文件相互引用,Python解释器报错。 foo.py: from bar import bar_var foo_var=1 bar.py: from foo import foo_var bar_var=2 import foo会产生如下错误: >>> import foo Traceback (most recent call last):   File "<stdin>", line 1, in ?   File "foo.py", line 1, in ?     from bar import bar_var   File "bar.py", line 1, in ?     from foo import foo_var ImportError: cannot import name foo_var >>> 但并非是因为交叉引用而报错,而是引用不存在! 导入一个模块时,发现已经导入,就不会再做一次导入。 from foo import foo_var 相当于运行foo.py, 然后令foo_var = foo.foo_var 这句会发现foo已经导入,但是foo_var=1还没有执行到, 所以bar.foo_var = foo.foo_var就会出错。 解决办法就是不要全局导入,可改为局部作用域内导入。 如果将from XXX import YYY改为import XXX就不会有上述错误了。

参考:

http://blog.csdn.net/jq0123/article/details/1527148

http://www.douban.com/group/topic/43938606/

《python核心编程》第二版,导入循环

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.51cto.com/dangzhiqiang复制
如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • python模块循环引用导致问题

    这个问题遇到几次了,代码写多了之后,莫名其妙报错。现在终于知道了是因为循环引用的问题。重现一下:

    py3study
  • 深入分析 JavaScript 模块循环引用

    大力教育的在线教室中台提供封装了核心能力的教室 SDK,业务方基于教室 SDK 开发面向用户的在线教室 App。最近对教室 SDK 做一次比较大的改动时,我遇到...

    用户6835371
  • 深入分析JavaScript模块循环引用

    在线教室中台提供封装了核心能力的教室 SDK,业务方基于教室 SDK 开发面向用户的在线教室 App。最近对教室 SDK 做一次比较大的改动时,我遇到了一个懵逼...

    玖柒的小窝
  • 【知识】使用Python来学习数据科学的完整教程

    编者按:Python学习和实践数据科学,Python和Python库能够方便地完成数据获取,数据探索,数据处理,数据建模和模型应用与部署的工作,对于数据科学工作...

    陆勤_数据人网
  • python模块-part1

    模块定义:模块就是实现了某个功能的代码集合,一个模块可以定义函数,类和变量。模块还可以包括可运行的代码。

    py3study
  • Spring源码解析(十)分析一个Spring循环引用失败的问题

    之前我们有分析过Spring是怎么解决循环引用的问题,主要思路就是三级缓存;Spring在加载beanA的时候会先调用默认的空构造函数(在没有指定构造函数实例化...

    石臻臻的杂货铺[同名公众号]
  • 生信分析人员如何系统入门python(2019更新版)

    一般来说,使用 Python 做生信有两种情况:一种是专门分析生物学数据(主要是各种组学),以调包为主,日常工作就是熟悉各种包的文档,写各种脚本串联工具分析流程...

    生信技能树
  • 垃圾回收机制

      我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式...

    py3study
  • 提高Python运行效率的六个窍门

    Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作。不仅如此,它还轻松支持多任务处理,比如多进程。

    py3study
  • Python机器学习·微教程

    所以这个教程既不是python入门,也不是机器学习入门。而是引导你从一个机器学习初级开发者,到能够基于python生态开展机器学习项目的专业开发者。

    朱卫军
  • 【Python】第一部分:第一段代码

    编程的基本思路就是 IPO。Input 获取数据,Process 逻辑计算,Output 显示结果。要学习pyton首先要明白pthon如何实现人机交互。

    杨丝儿
  • 计算机相关专业“Python程序设计”教学大纲(参考)

    适用专业:计算机科学与技术、软件工程、网络工程、通信工程、数字媒体技术大数据应用技术及其他工科专业

    Python小屋屋主
  • 如何快速学会Python处理数据?(5000字走心总结)

    很多同学抱怨自己很想学好Python,但学了好久,书也买不少,视频课程也看了不少,但是总是学了一段时间,感觉还是没什么收获,碰到问题没思路,有思路写不出多少行代...

    1480
  • 算法channel关键词和文章索引

    希望时间的流逝不仅仅丰富了我们的阅历,更重要的是通过提炼让我们得以升华,走向卓越。 1Tags 排序算法 链表 树 图 动态规划 ...

    double
  • 算法channel使用指南(V2.0)

    01 引言 欢迎关注 算法channel ! 交流思想,分享知识,找到迈入机器学习大门的系统学习方法,并在这条道路上不断攀登,这是小编创办本公众号的初衷。 本...

    double
  • 如果你想学好Python,这几本书说不定可以帮助到你哦

    谭庆波
  • 说说提高Python运行效率的技巧?

    小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

    程序IT圈
  • 通过示例学 Golang 2020 中文版【翻译完成】

    ApacheCN_飞龙
  • 一把 sklearn 走天下 | 统计师的Python日记 第12天

    今天将带来第12天的学习日记,开始学习Python的机器学习库:Scikit-learn(这个系列会不断连载,建议关注哦~)。本文会先认识一下 sklearn ...

    数说君

扫码关注云+社区

领取腾讯云代金券