Python模块之间的相互引用冲突问题

Python模块之间的相互引用冲突问题

异常

python交叉循环引用(即在a中调用b,同时b中又调用a)会引发相互引用的冲突。

A、B、C三个py文件,文件中定义了方法或者变量

A文件中 from B import b
B文件中 from A import a
C文件中 from A import a

异常:ImportError cannot import name ‘goods_bp’ from partially initialized module ‘goods’ (most likely due to a circular import)

提示:循环导入

解决办法一

规划好代码的层级

哪些是公共方法,哪些是业务逻辑,把这些提前想好,有利于后期的维护。

为了要解决这个问题,需要先理解,在python中使用import时,代码到底是如何运行的:

当我们import一个文件时,python会首先去查找这个文件之前是否被import过,如果这个文件之前有被import过,就不会重新再import一次。

所以如果A模块代码里import了B模块,并且B模块里又import了A模块,python的执行顺序会变成这样:开始执行模块A当A执行到import B的地方,则停止执行A模块后面的代码,转而开始执行B模块的代码,当B模块从头执行到import A的地方时,python此时并不会回过头去接着执行A剩余的代码,而且将A模块在中断前已经初始化的属性全加载到B模块中。

了解了import的执行过程,那么就可以给出相应的解决方案了:

在module的顶部引入,引入another module,绝对引入

在module底部引入another module的attribute,而非another module,用from

函数顶部引入,可以用from

解决方法二:

不要使用A和B互相导入的写法,可以再新建一个python文件存放,例如:

新建一个D文件,将A、B文件的变量移动至D文件中

修改A文件导入为 from D import b

修改B文件导入为 from D import a

————————————————