首頁 > 軟體

一篇文章徹底弄懂Python中的if __name__ == __main__

2022-12-09 14:02:36

1. 引言

在Python相關程式碼中,我們經常會遇到如下程式碼段:

# stuff
if __name__ == "__main__":
    # do stuff

本文將盡可能使用簡單的樣例來解釋這裡發生了什麼,以及需要使用if __name__=="__main__"的情形。請注意,上述程式碼中namemain前後有2個下劃線字元。

閒話少說,我們直接開始吧!

2. 特殊變數

當我們正常執行我們的Python指令碼時,該指令碼中的變數__name__的值一般為__main__。我們來看個範例:

# first.py
print(__name__)

我們在終端中執行上述指令碼,程式碼如下:

python first.py  

輸出如下:

__main__

觀察上述輸出,當我們執行指令碼first.py的時候,變數__name__的值被設定為__main__

3. 複雜的例子

上述範例相對簡單,也相對容易理解。接著我們來舉個具有多個檔案的例子,這裡假設我們有三個指令碼,分別為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.pyc.py中的變數·__name__分別保持為bc,這是因為指令碼b.pyc.py不是直接執行的指令碼。而是我們執行的指令碼a.py呼叫了b.pyc.py中的print函數。

如果我們單獨執行python b.py得到結果如下:

__name__ in b.py: __main__

相應的我們執行python c.py,得到結果如下:

__name__ in c.py: __main__

觀察上述兩個輸出,當我們直接執行指令碼b.pyc.py,相應的指令碼裡的變數__name__都將被設定為__main__

4. 使用場景

作為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.pyhelper.py來控制該測試語句的輸出,但是這種情形就是語句
if __name__=="__main__" 大顯身手的情形。

5. 解決方案

我們針對上述情形,進行程式碼整改,如下:

# 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__,所以此時的測試語句將會被執行,輸出相應的測試結果。

6. 總結

本文重點介紹了Python中常見的if __name__=="__main__" ,重點分析了其背後的原理和應用的場景。

到此這篇關於Python中if __name__ == __main__的文章就介紹到這了,更多相關Python中if __name__ == __main__內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com