模塊基礎-03循環導入問題

一丶什麼是循環導入

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

y = 'm1'

 1.建立m2的名稱空間
 2.執行m2.py,將執行產生的名字丟到m2.py
 3.在當前執行文件中拿到m2.xpython

# 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
 在當前執行文件中拿到m1
  * 若是運行run.py,則會報錯ImportError: cannot import name 'y'
  * 若是運行m1.py,則會報錯ImportError: cannot import name 'x'
  * 若是運行m2.py,則會報錯ImportError: cannot import name 'y'code


二丶解決方案

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

2.1 方案一(推薦方法)

放在函數體中導入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'

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