首先需要明白:循环导入是一种错误的方式!!!
1.模块的循环导入:
在大型的python项目中,需要很多python文件,由于架构不当,可能会出现模块之间的相互导入。
A :模块
def test():
f()
B :模块
def f():
test()
2.一个循环导入的例子:-----------------
# 1. 文件object5.py中代码
from object5_2 import func
def task1():
print('--task1---')
def task2():
print('--task2---')
func()码片
# 2. 文件object5_5.py中代码
from object5 import task1
def func():
task1()
print('循环导入_2中的task1')
# 运行文件object5.py的时候就会出错:
# Traceback (most recent call last):
# File "D:/Python/code/mainxiangobject/object5.py", line 11, in <module>
# from object5_2 import func
# File "D:\Python\code\mainxiangobject\object5_2.py", line 1, in <module>
# from object5 import task1
# File "D:\Python\code\mainxiangobject\object5.py", line 11, in <module>
# from object5_2 import func
# ImportError: cannot import name 'func'
出错原因:
在执行object5.py的时候,首先执行from object5_2 import func
这样去到object5_5.py中,又开始执行from object5 import task1
这样再去到object5.py…
如此,就造成了死循环。。。
-----这就是模块的循环导入问题
# 修改1:--------------------
# 1. 文件object5.py中代码
from object5_2 import func
def task1():
print('--task1---')
def task2():
print('--task2---')
func()
# 2. 文件object5_5.py中代码
# def func():
# from object5 import task1
# task1()
# print('循环导入_2中的task1')
task1()
task2()
# --task1---
# --task2---
# --task1---
# --task2---
# --task1---
# 循环导入_2中的task1
# --task1---
# 循环导入_2中的task1
这样看打印的内容有些多,
这是由于每次导入的时候就会加载一遍函数内的内容
# 修改2:--------------------
# 在“修改1”的基础上,将task1(),task2()放在主函数里面
# 这样在被导入该模块的时候,就只会调用相关函数,就不再会加载本文件本身的执行内容
if __name__=='__main__':
task1()
task2()
# --task1---
# --task2---
# --task1---
# 循环导入_2中的task1
3.避免产生循环导入的方式:
1.重新架构
2.将导入的语句放入函数体里面
3.把导入语句放在模块最后