065 循环导入问题

一、什么是循环导入?

说白了,就是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
原文地址:https://www.cnblogs.com/XuChengNotes/p/11358326.html