一、什么是循環導入?
# m1.py
print('from m1.py')
from m2 import x
y = 'm1'
- 創建m2的名稱空間
- 執行m2.py,將執行產生的名字丟到m2.py
- 在當前執行文件中拿到m2.x
# m2.py
print('from m2.py')
from m1 import y
x = 'm2'
- 創建m1的名稱空間
- 執行m1.py,將執行產生的名字丟到m1.py
- 在當前執行文件中拿到m1.y
# run.py
import m1
- 創建m1的名稱空間
- 執行m1.py,將執行產生的名字丟到m1.py
- 在當前執行文件中拿到m1
- 如果運行run.py,則會報錯
ImportError: cannot import name 'y'
- 如果運行m1.py,則會報錯
ImportError: cannot import name 'x'
- 如果運行m2.py,則會報錯
ImportError: cannot import name 'y'
二、解決方案
我們可以使用函數定義階段只識別語法的特性解決循環導入的問題,我們也可以從本質上解決循環導入的問題,但是最好的解決方法是不要出現循環導入。
2.1 方案一
# 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 方案二
# m1.py
print('from m1.py')
y = 'm1'
from m2 import x
# m2.py
print('from m2.py')
x = 'm2'
from m1 import y