if name==main是什麼意思_Python中if __name__ == "__main__":是什麼意思
技術標籤:if name==main是什麼意思
點選上方“藍字”關注三豐每當Python直譯器讀取原始檔時,它都會做兩件事:
- 它設定了一些特殊變數,例如
__name__
,然後 - 它執行檔案中找到的所有程式碼。
一 程式碼樣例
假設程式碼在一個叫做foo.py的檔案中。
print("beforeimport")
importmath
print("beforefunctionA")
deffunctionA():
print("FunctionA")
print("beforefunctionB")
deffunctionB():
print("FunctionB{}".format(math.sqrt(100)))
print("before__name__guard")
if__name__=='__main__':
functionA()
functionB()
print("after__name__guard")
二 執行程式碼
當Python直譯器讀取原始檔時,它首先會定義一些特殊的變數。比如__name__
雖然它長得很奇怪,前面和後面都有一個下劃線_
,但是記得變數命名的規則嘛?下劃線_
是可以出現在變數首字母的。所以,__name__
仍然是一個變數,只不過,是直譯器自己定義的。
2.1 作為主程式執行
當我們在命令列中使用python foo.py
,或者直接在ide(比如pycharm)圖形介面裡點執行foo.py,那麼這時候,foo.py就是作為主程式執行的。
此時:Python直譯器會直接給_name_
變數賦值為"_main_
"
2.2 作為匯入的模組執行
如果有另一個程式,叫main.py
,它裡面的程式碼是這樣的。
importfoo
那麼如果我們在命令列中使用python main.py
,則main.py
作為主程式執行,而foo.py就是匯入的模組。
此時:Python直譯器會令__name__ = "foo"
2.3 執行foo.py檔案中的程式碼
如果使用主程式執行!python foo.py
:輸出如下:
beforeimport
beforefunctionA
beforefunctionB
before__name__guard
FunctionA
FunctionB10.0
after__name__guard
如果使用主程式執行import foo
:輸出如下:
beforeimport
beforefunctionA
beforefunctionB
before__name__guard
after__name__guard
可以明顯看到,當使用主程式執行import foo
時,沒有執行下面語句的內容,因為此時__name__ = 'foo'
if__name__=='__main__':
functionA()
functionB()
為什麼這樣工作?
有時我們想編寫一個.py檔案,該檔案既可以被其他程式和模組匯入,也可以作為主程式執行。例子如下:
這個檔案是一個庫,可以被其他檔案匯入。但是我們希望可以在其中執行一些單元測試或演示。
這個檔案僅用作主程式,但具有一些單元測試的功能,一些測試框架(類似
unittest
和doctest
)需要匯入這個.py
檔案來測試。我們不希望,它只是因為被匯入為模組,就直接執行整個指令碼。這個模組主要用作主程式,但它也為高階使用者提供了程式設計師友好的
API
。
所以,其實就是有的時候希望他在被匯入的時候執行一些程式碼,有的時候希望他作為主程式的時候執行另一些程式碼。所以需要進行判斷。
參考資料
[1]參考: https://stackoverflow.com/questions/419163/what-does-if-name-main-do
這是三豐陪英俊帥氣的你成長的第24篇文章 關注學習更多雜牌CS知識