Python模块的交叉引用问题怎么解决

发布时间:2022-01-04 10:25:41 作者:iii
来源:亿速云 阅读:250

本篇内容介绍了“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就不会有上述错误了。

“Python模块的交叉引用问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. python模块--subprocess
  2. Python模块random

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:怎样删除Windows C盘所有文件

下一篇:JS的script标签属性有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》