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
————————————————