關于Python中的if __name__ == __main__詳情
關于在學習Python的過程中,遇到的這類似的代碼:
if __name__ == "__main__":
print("Hello World!")

1.程序入口
對于很多編程語言來說,程序都必須要有一個入口,比如 C,C++,以及完全面向?qū)ο蟮木幊陶Z言 Java,C# 等。如果你接觸過這些語言,對于程序入口這個概念應該很好理解,C 和 C++ 都需要有一個 main 函數(shù)來作為程序的入口,也就是程序的運行會從 main 函數(shù)開始。同樣,Java 和 C# 必須要有一個包含 Main 方法的主類來作為程序入口。
而 Python 則有不同,它屬于腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態(tài)的逐行解釋運行。也就是從腳本第一行開始運行,沒有統(tǒng)一的入口。
if __name__ == “__main__”: 本質(zhì)就是一個if判斷,但它又不是一個簡單的if判斷。即當.py文件運行時,__name__ 是'__main__' 時運行下面if下的代碼,則否不運行。當然你也可以把代碼寫成這樣:
if __name__ == "__main__":
print("Hello World!")
else:
print("Hello Mars!")
2.__name__是什么?
__name__是Python內(nèi)置的變量,它是每個 Python 模塊必備的屬性,但它的值取決于你是如何執(zhí)行這段代碼的。
當你直接執(zhí)行一段腳本的時候,這段腳本的 __name__變量等于 ‘__main__'
當這段腳本被導入其他程序的時候,__name__ 變量等于腳本本身的名字
場景1:直接運行腳本
假設我們有一個nameScript.py,代碼如下:
def myFunction():
print('The value of __name__ is ' + __name__)
def main():
myFunction()
if __name__ == '__main__':
main()
直接執(zhí)行這個文件后流程為:

在所有其他代碼執(zhí)行之前,__name__變量就被設置為 ‘__main__' 了。在此之后,通過執(zhí)行 def 語句,函數(shù) main() 和 myFunction() 的本體被載入。接著,因為這個 if 語句后面的表達式為真 true,函數(shù) main() 就被調(diào)用了。而 main() 函數(shù)又調(diào)用了myFunction(),打印出變量的值'__main__'。
場景2:從其他腳本導入
如果你需要在其他腳本里重用這個 myFunction() 函數(shù),比如在 importingScript.py 里,我們可以將 nameScript.py 作為一個模組導入。
importingScript.py 的內(nèi)容如下:
import nameScript as ns ns.myFunction()
這時,我們就有了兩個不同的作用域:一個是 importingScript 的,一個是 nameScript 的:

在 importingScript.py 里,__name__ 變量就被設置為 ‘__main__'。當導入 nameScript 的時候,Python 就在本地和環(huán)境變量 PATH 指向的路徑中尋找對應名稱的 .py 文件,找到之后,將會運行導入的文件中的代碼。
但這一次,在導入的時候,它自身的 __name__ 變量就被設置為了 ‘nameScript',接下來還是一樣,函數(shù) main() 和 myFunction() 的本體被載入。然而,這一次 if 語句后面的表達式結(jié)果為假 false,所以 main() 函數(shù)沒有被調(diào)用。
導入完畢之后,回到 importingScript.py 中。現(xiàn)在 nameScript 模塊中的函數(shù)定義已經(jīng)被導入到當前的作用域中,于是我們通過 ns.myFunction() 的方式調(diào)用模塊中的函數(shù),這個函數(shù)返回的是模塊內(nèi)的變量的值 ‘nameScript'。
如果你試著在 importingScript 中打印 __name__ 變量的值,那當你直接執(zhí)行 importingScript 的時候,它也會輸出 ‘__main__'。原因在于,這個變量是在 importingScript 的作用域中的。
3.__name__可以顯示包路徑
我們建立這樣一個目錄結(jié)構:
a ├── b │├── c.py │└── __init__.py └── __init__.py d.py
c.py文件中的代碼:
print(__name__)
d.py文件中的代碼:
from a.b import c
運行d.py文件,結(jié)果為:
a.b.c
此時a.py文件的__name__屬性變成了a.b.c,完完全全反映了它所在的包路徑。
5.測試模塊里函數(shù)
由于一個腳本被引入時,自身的代碼會被執(zhí)行,因此我們在每個腳本里都寫上一段if __name__ == ‘__main__': 如果你希望一些代碼只有在腳本被直接執(zhí)行時才執(zhí)行,那么就把這些代碼放入到if 語句塊中,最常見的情形就是測試代碼:
def safe_division(a, b): if b == 0: return None return a/b if __name__ == '__main__': print(safe_division(10, 5) == 2) print(safe_division(10, 0) == None)
我們寫完一個函數(shù)后,不免要寫一些測試的代碼,而這些測試的代碼我們不希望他們在引入時執(zhí)行,只有當我們主動執(zhí)行進行測試才執(zhí)行這些測試代碼。
到此這篇關于關于Python中的if __name__ == ‘__main__'詳情的文章就介紹到這了,更多相關Python中的if __name__ == ‘__main__'內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。
關注官方微信