一、匯入迴圈
在大型的python工程中,由於架構設計不當,可能會出現模組間相互引用的情況。
這時候需要通過一些方法來解決這個問題.
(1)重新設計架構,解除相互引用的關係。
(2)把import語句放置在模組的最後
(3)把import語句放置在函式中
1、重新設計架構,解除相互引用
-------- 後續補充 ---------
2、把import語句放置在模組最後
-------- 後續補充 ---------
3、把import語句放置在函式中
例子:乙個系統由兩部分組成,包括control主模組和submodule模組。
其中control模組包含ctlcommon()和control(),submodule模組包含submodule(),並且在submodule()中會用到ctlcommon()。
# control.py
from submodule import submodule
def ctlcommon():
print("enter ctlcommon")
def control():
print("-------enter control-------")
submodule()
print("++++++++exit control+++++++")
control()
# submodule.py
import control
def submodule():
print("enter submodule calling ctlcommon")
control.ctlcommon()
分析1:執行control.py
從traceback看,兩個模組互相匯入,造成匯入迴圈錯誤。
$ python control.py # 執行control.py
traceback (most recent call last):
file "d:\selfstudy\pythonstudy\grammar\basic usage\module\control.py", line 2, in from submodule import submodule
file "d:\selfstudy\pythonstudy\grammar\basic usage\module\submodule.py", line 2, in import control
file "d:\selfstudy\pythonstudy\grammar\basic usage\module\control.py", line 2, in from submodule import submodule
importerror: cannot import name 'submodule'
方案:把submodule.py中的匯入模組語句放在函式中
# submodule.py
def submodule():
import control
print("enter submodule calling ctlcommon")
control.ctlcommon()
結果分析:為了更好的理解執行過程,我們把submodule()在control()函式中展開。
執行control.py,會去執行control()函式。control()函式的執行步驟:
step1、執行(a)
step2、import control,由於是第一次匯入(import),會載入(load)該模組。
該模組的匯入**會被執行,因此執行一次control()函式。結果中黑色加粗的部分。
step3、順序執行(b), (c), (d)
def control():
print("-------enter control-------") # (a)
#submodule() # 把submodule()函式展開
import control
print("enter submodule calling ctlcommon") # (b)
control.ctlcommon() # (c)
print("++++++++exit control+++++++") # (d)
$ python control.py # 執行control.py
-------enter control------- #(a)
-------enter control-------
enter submodule calling ctlcommon
enter ctlcommon
++++++++exit control+++++++
enter submodule calling ctlcommon # (b)
enter ctlcommon # (c)
++++++++exit control+++++++ # (d)
分析2:執行submodule.py
$ python submodule.py
-------enter control------- # (a)
enter submodule calling ctlcommon
enter ctlcommon
++++++++exit control+++++++ # (d)
結果分析:
執行submodule模組,首先去匯入和載入control模組
#import control # 第一次匯入會去執行頂層目錄**,也就是說會去執行control()
control() # control中會先執行列印(a), 然後呼叫submodule(), 最後執行列印(d)
def submodule():
print("enter submodule calling ctlcommon")
control.ctlcommon()
python匯入迴圈問題
m1.py print 正在匯入m1 x m1 from m2 import y1 建立m2的命名空間 2 執行m2.py,將執行產生的名字丟到m2.py 3 在當前執行檔案中拿到m2.y m2.py print 正在匯入m2 y m2 from m1 import x1 建立m1的命名空間 2 執...
迴圈匯入問題
目錄python從入門到放棄完整教程目錄 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 impo...
迴圈匯入問題
m1.py print from m1.py from m2 import x y m1 m2.py print from m2.py from m1 import y x m2 run.py import m1 我們可以使用函式定義階段只識別語法的特性解決迴圈匯入的問題,我們也可以從本質上解決迴圈...