Python __name__=='__main__'作用詳解

2020-07-16 10:05:10
前面章節已經對模組及其用法做了詳解的介紹,相信有很多讀者已經開始去嘗試閱讀別人的程式碼了(通常閱讀比自己牛的人寫的程式碼,會讓自己的技術水平飛速提高)。不過,在閱讀別人寫的自定義模組時,經常會看到有如下這行判斷語句:
if __name__ == '__main__':
這行程式碼的作用是什麼呢?本節就詳解講解以下它的作用。

一般情況下,當我們寫完自定義的模組之後,都會寫一個測試程式碼,檢驗一些模組中各個功能是否能夠成功執行。例如,建立一個 candf.py 檔案,並編寫如下程式碼:
'''
攝氏度和華氏度的相互轉換模組
'''
def c2f(cel):
    fah = cel * 1.8 + 32
    return fah
def f2c(fah):
    cel = (fah - 32) / 1.8
    return cel
def test():
    print("測試資料:0 攝氏度 = %.2f 華氏度" % c2f(0))
    print("測試資料:0 華氏度 = %.2f 攝氏度" % f2c(0))
test()
單獨執行此模組檔案,可以看到如下執行結果:

測試資料:0 攝氏度 = 32.00 華氏度
測試資料:0 華氏度 = -17.78 攝氏度


在 candf.py 模組檔案的基礎上,在同目錄下再建立一個 demo.py 檔案,並編寫如下程式碼:
import candf
print("32 攝氏度 = %.2f 華氏度" % candf.c2f(32))
print("99 華氏度 = %.2f 攝氏度" % candf.f2c(99))
執行 demo.py 檔案,其執行結果如下所示:

測試資料:0 攝氏度 = 32.00 華氏度
測試資料:0 華氏度 = -17.78 攝氏度
32 攝氏度 = 89.60 華氏度
99 華氏度 = 37.22 攝氏度

可以看到,Python直譯器將模組(candf.py)中的測試程式碼也一塊兒執行了,這並不是我們想要的結果。想要避免這種情況的關鍵在於,要讓 Python 直譯器知道,當前要執行的程度程式碼,是模組檔案本身,還是匯入模組的其它程式。

為了實現這一點,就需要使用 Python 內建的系統變數 __name__,它用於標識所在模組的模組名。例如,在 demo.py 程式檔案中,新增如下程式碼:
print(__name__)
print(candf.__name__)
其執行結果為:
__main__
candf
可以看到,當前執行的程式,其 __name__ 的值為 __main__,而匯入到當前程式中的模組,其 __name__ 值為自己的模組名。

因此,if __name__ == '__main__': 的作用是確保只有單獨執行該模組時,此表示式才成立,才可以進入此判斷語法,執行其中的測試程式碼;反之,如果只是作為模組匯入到其他程式檔案中,則此表示式將不成立,執行其它程式時,也就不會執行該判斷語句中的測試程式碼。