在Python相關代碼中,我們經常會遇到如下代碼段:
# stuff
if __name__ == "__main__":
# do stuff
本文將盡可能使用簡單的樣例來解釋這裏發生了什麼,以及需要使用if __name__=="__main__"的情形。請注意,上述代碼中name和main前後有2個下劃線字符。
閑話少說,我們直接開始吧!
當我們正常運行我們的Python腳本時,該腳本中的變量__name__的值一般為__main__。我們來看個示例:
# first.py
print(__name__)
我們在終端中運行上述腳本,代碼如下:
python first.py
輸出如下:
__main__
觀察上述輸出,當我們運行腳本first.py的時候,變量__name__的值被設置為__main__。
上述示例相對簡單,也相對容易理解。接著我們來舉個具有多個文件的例子,這裏假設我們有三個腳本,分別為a.py,b.py以及c.py。
其中,a.py的內容如下:
# a.py
print("__name__ in a.py:", __name__)
from b import *
from c import *
此時,b.py的內容如下:
# b.py
print("__name__ in b.py:", __name__)
c.py的內容如下:
# c.py
print("__name__ in c.py:", __name__)
如果我們運行命令python a.py得到結果如下:
__name__ in a.py: __main__
__name__ in b.py: b
__name__ in c.py: c
注意在腳本a.py中我們看到__name__的值為__main__,此時在腳本b.py中__name__的值為b, 同時 c.py中__name__的值為c。這是因為我們運行的腳本為a.py,那麼該腳本即a.py中變量__name__的值將會被設置為字符串__main__.
此外,腳本b.py和c.py中的變量·__name__分別保持為b和c,這是因為腳本b.py和c.py不是直接運行的腳本。而是我們運行的腳本a.py調用了b.py和c.py中的print函數。
如果我們單獨運行python b.py得到結果如下:
__name__ in b.py: __main__
相應的我們運行python c.py,得到結果如下:
__name__ in c.py: __main__
觀察上述兩個輸出,當我們直接運行腳本b.py或c.py,相應的腳本裏的變量__name__都將被設置為__main__。
作為Python開發者,我們通常會在一個項目工程中創建多個Python文件而不是將所有代碼都寫在一個Python文件中。因此我們通常會有一個主的Python文件用來作為項目工程的入口,同時其他文件包含一些輔助性的函數實現。
我們來看個示例,這裏假設我們有兩個Python文件,如下:
# main.py
from helper import *
print(greet("bob"))
輔助函數實現 helper.py內容如下:
# helper.py
def greet(name):
return "hello " + name
print(greet("testname"))
如果此時我們運行命令 python main.py,得到結果如下:
hello bob
hello testname
主要上述的import語句將從helper.py中引入所有的語句,所以helper.py中的測試語句print(greet("testname"))也將被執行。雖然我們可以通過添加注釋或者屏蔽注釋來達到運行main.py或helper.py來控制該測試語句的輸出,但是這種情形就是語句if __name__=="__main__" 大顯身手的情形。
我們針對上述情形,進行代碼整改,如下:
# main.py
from helper import *
print(greet("bob"))
我們修改文件 helper.py內容如下:
def greet(name):
return "hello " + name
if __name__ == "__main__":
print(greet("testname"))
此時,我們執行命令python main.py,得到結果如下:
hello bob
注意,此時helper.py 中的變量 __name__的值為helper, 所以helper.py中的if語句不成立,進而將不會執行我們的測試語句print(greet("testname")).
此時,如果我們單獨運行命令python helper.py ,得到結果如下:
hello testname
單獨運行helper.py時,此時改腳本中的變量__name__將被設置為__main__,所以此時的測試語句將會被執行,輸出相應的測試結果。
本文重點介紹了Python中常見的if __name__=="__main__" ,重點分析了其背後的原理和應用的場景。
您學廢了嘛?
關注公眾號《AI算法之道》,獲取更多AI算法資訊。