Fork me on GitHub

模块循环导入问题

模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码
在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方
在程序出现了循环/嵌套导入后的异常分析、解决方法如下

#示范文件内容如下
#m1.py
print('正在导入m1')
from m2 import y

x='m1'

#m2.py
print('正在导入m2')
from m1 import x

y='m2'

#run.py
import m1

在run文件导入模块m1,在模块m1中语法检测还没到x='m1',就导入m2并要y这个变量名,
然后在m2中导入m1并且要x这个变量名,并且语法检测还没有到y='m2'。所以在m2中
导入模块m1中的名称空间中没有x变量名,在m1中导入模块m2中的名称空间中没有y变量名,
由此因为互相都找不到自己需要的变量名而报错。

解决方法一:导入语句放在最后

#示范文件内容如下
#m1.py
print('正在导入m1')
x='m1'
from m2 import y

#m2.py
print('正在导入m2')
y='m2'
from m1 import x

#run.py
import m1

将各自的需要名放在导入模块之前,这样就能检测到变量名,并装入各自模块的名称空间中,
但在繁杂编码中很能次次都注意到。

解决方法二:导入语句放在函数中

#m1.py
print('正在导入m1')

def f1():
    from m2 import y
    print(x,y)

x = 'm1'

# f1()

#m2.py
print('正在导入m2')

def f2():
    from m1 import x
    print(x,y)

y = 'm2'

#run.py
import m1

m1.f1()

利用函数的特性先定义后调用,这样调用了函数才会导入模块,在run中导入m1模块,先执行m1中的代码,
然后由于导入语句封装在函数下,所以没有触发导入模块,这样m1中的变量名则全部放入它的名称空间中,
最后在执行函数则触发了模块m2的导入,然后m2导入m1模块同理,则两个模块的名称空间都有了对方要的变量名。

posted @ 2020-09-02 10:47  artherwan  阅读(178)  评论(0编辑  收藏  举报