前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python模块的交叉引用(导入循环)问题分析

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

作者头像
党志强
发布2020-02-11 11:09:43
4.7K0
发布2020-02-11 11:09:43
举报
文章被收录于专栏:敏而好学敏而好学敏而好学

    实际项目中遇到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核心编程》第二版,导入循环

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-08-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档