這篇內容是轉自廖雪峯官網python學習模塊的一位學員(“又該換暱稱了”)的描述,借鑑學習:
出處:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431845183474e20ee7e7828b47f7b7607f2dc1e90dbb000#0
關於代碼if name == 'main': 可能看了之後可能挺暈的,下面舉幾個例子解釋下,希望能讓大家對這行的代碼的功能有更深的認識,還是那句話,歡迎大家指正定會虛心接受。
先編寫一個測試模塊atestmodule.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
def addFunc(a,b):
return a+b
print('atestmodule計算結果:',addFunc(1,1))
再編寫一個模塊anothertestmodule.py來調用上面的模塊:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
import atestmodule
print('調用anothermodule模塊執行的結果是:',atestmodule.addFunc(12,23))
在剛纔兩個模塊的路徑(我的路徑爲:“C:\work”)中打開cmd,用命令行運行atestmodule.py:
C:\work>python atestmodule.py
atestmodule計算結果: 2
在剛纔兩個模塊的路徑中打開,用命令行運行anothertestmodule.py:
C:\work>python anothertestmodule.py
atestmodule計算結果: 2
調用test模塊執行的結果是: 35
#顯然,當我運行anothertestmodule.py後第一句並不是調用者所需要的,爲了解決這一問題,Python提供了一個系統變量:__name__
#注:name兩邊各有2個下劃線__name__有2個取值:當模塊是被調用執行的,取值爲模塊的名字;當模塊是直接執行的,則該變量取值爲:__main__
於是乎,被調用模塊的測試代碼就可以寫在if語句裏了,如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
def addFunc(a,b):
return a+b
if __name__ == '__main__':
print('atestmodule計算結果:',addFunc(1,1))
當再次運行atestmodule.py:
C:\work>python atestmodule.py
atestmodule計算結果: 2
#結果並沒有改變,因爲調用atestmodule.py時,__name__取值爲__main__,if判斷爲真,所以就輸出上面的結果
當再次運行atestmodule.py:
C:\work>python anothertestmodule.py
調用test模塊執行的結果是: 35
#此時我們就得到了預期結果,不輸出多餘的結果。能實現這一點的主要原因在於當調用一個module時,此時的__name__取值爲模塊的名字,所以if判斷爲假,不執行後續代碼。
所以代碼if name == 'main': 實現的功能就是Make a script both importable and executable,也就是說可以讓模塊既可以導入到別的模塊中用,另外該模塊自己也可執行。