057 循環導入問題

循環導入問題

1.什麼時循環導入

其實就是咱們有一個A.py文件和一個B.py文件,咱們在A.py文件導入B模塊的某個名稱,在B.pypython

文件中又導入了A模塊的某個名稱,可是因爲咱們把from···import都卸載了這兩個文件的開頭,因此就會出現循環導入的問題。函數

咱們先執行哪個.py文件,若是出現了循環導入的問題,程序就會報錯這兩個模塊裏某一個模塊沒有另外一個模塊要找的名稱code

# 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.解決方案

咱們能夠使用函數定義階段只識別語法的特性解決循環導入的問題,咱們也能夠從本質上解決循環導入的問題,可是最好的解決方法是不要出現循環導入。class

  • 方案一import

    使用函數定義階段只識別語法的特性,在這兩個模塊都定義函數,而且須要把from····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'
  • 方案二語法

    就是把咱們兩個模塊須要從對方模塊中找到的名字提早和from····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
相關文章
相關標籤/搜索