對於很多編程語言來說,程序都必須要有一個入口,比如 C,C++,以及完全面向對象的編程語言 Java,C# 等。如果你接觸過這些語言,對於程序入口這個概念應該很好理解,C 和 C++ 都需要有一個 main 函數來作為程序的入口,也就是程序的運行會從 main 函數開始。同樣,Java 和 C# 必須要有一個包含 Main 方法的主類來作為程序入口。
而 Python 則有不同,它屬於腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。
一個 Python 源碼文件除了可以被直接運行外,還可以作為模塊(也就是庫)被導入。不管是導入還是直接運行,最頂層的代碼都會被運行(Python 用縮進來區分代碼層次)。而實際上在導入的時候,有一部分代碼我們是不希望被運行的。
舉一個例子來說明一下,假設我們有一個 const.py 文件,內容如下:
PI = 3.14 def main(): print "PI:", PI main()
我們在這個文件里邊定義了一些常量,然后又寫了一個 main 函數來輸出定義的常量,最后運行 main 函數就相當於對定義做一遍人工檢查,看看值設置的都對不對。然后我們直接執行該文件(python const.py),輸出:
PI: 3.14
現在,我們有一個 area.py 文件,用於計算圓的面積,該文件里邊需要用到 const.py 文件中的 PI 變量,那么我們從 const.py 中把 PI 變量導入到 area.py 中:
from const import PI def calc_round_area(radius): return PI * (radius ** 2) def main(): print "round area: ", calc_round_area(2) main()
運行 area.py,輸出結果:
PI: 3.14
round area: 12.56
可以看到,const 中的 main 函數也被運行了,實際上我們是不希望它被運行,提供 main 也只是為了對常量定義進行下測試。這時,if __name__ == '__main__'
就派上了用場。把 const.py 改一下:
PI = 3.14 def main(): print "PI:", PI if __name__ == "__main__": main()
然后再運行 area.py,輸出如下:
round area: 12.56
再運行下 const.py,輸出如下:
PI: 3.14
這才是我們想要的效果。