"if __name__ == '__main__': " 實現的功能就是Make a script both importable and executable

這篇內容是轉自廖雪峯官網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,也就是說可以讓模塊既可以導入到別的模塊中用,另外該模塊自己也可執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章