1. 程式人生 > 其它 >if name==main是什麼意思_Python中if __name__ == "__main__":是什麼意思

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檔案,該檔案既可以被其他程式和模組匯入,也可以作為主程式執行。例子如下:

  • 這個檔案是一個庫,可以被其他檔案匯入。但是我們希望可以在其中執行一些單元測試或演示。

  • 這個檔案僅用作主程式,但具有一些單元測試的功能,一些測試框架(類似unittestdoctest)需要匯入這個.py檔案來測試。我們不希望,它只是因為被匯入為模組,就直接執行整個指令碼。

  • 這個模組主要用作主程式,但它也為高階使用者提供了程式設計師友好的API

所以,其實就是有的時候希望他在被匯入的時候執行一些程式碼,有的時候希望他作為主程式的時候執行另一些程式碼。所以需要進行判斷。


參考資料

[1]

參考: https://stackoverflow.com/questions/419163/what-does-if-name-main-do

c68f436fd5cf5be7ebcd95251f594942.png這是三豐陪英俊帥氣的你成長的第24篇文章 eed54496dbb31dcbff6dfecf16262f56.png a34fa2df98f7576f47db57d9c08d89be.png關注學習更多雜牌CS知識