循環導入問題


一、什么是循環導入?

60循環導入問題-死循環.jpg?x-oss-process=style/watermark

# m1.py
print('from m1.py')
from m2 import x

y = 'm1'
  1. 創建m2的名稱空間
  2. 執行m2.py,將執行產生的名字丟到m2.py
  3. 在當前執行文件中拿到m2.x
# m2.py
print('from m2.py')
from m1 import y

x = 'm2'
  1. 創建m1的名稱空間
  2. 執行m1.py,將執行產生的名字丟到m1.py
  3. 在當前執行文件中拿到m1.y
# run.py
import m1
  1. 創建m1的名稱空間
  2. 執行m1.py,將執行產生的名字丟到m1.py
  3. 在當前執行文件中拿到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM