一、什么是循环导入?
说白了,就是A模块导入B模块,A模块要使用B模块中的东西。B模块也要导入A模块,B模块也要使用A模块中的东西。但是由于import
都是写在文件开头,所以就会出现循环导入的问题。
循环导入报错会报AttributeError: module 'm2' has no attribute 'y'
。就是模块m2中没有y这个东西。
二、解决方法
我们可以使用函数定义阶段只识别语法的特性解决循环导入的问题,我们也可以从本质上解决循环导入的问题,但是最好的解决方法是不要出现循环导入。
2.1 方案一
将import写在函数内部,利用函数的特性,不调用就不会执行。但是,被调用的元素要写在函数外面,方便调用。
# m1.py
print('from m1.py')
def func1():
from m2 import x
print(x)
y = 'm1'
# m2.py
print('from m2.py')
def func1():
from m1 import y
print(y)
x = 'm2'
2.2 方案二
将被调用元素写在import之前。
# m1.py
print('from m1.py')
y = 'm1'
from m2 import x
# m2.py
print('from m2.py')
x = 'm2'
from m1 import y