循環導入問題

1、什麼是循環導入?

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

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

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
相關文章
相關標籤/搜索