在前一天的 Python Flask 示範當中,在程式碼的最下面有展示到 __name__ = "__main__"
,那今天就是要來和大家分享其中蘊含的概念和使用方式!
__name__ = "__main__"
。Python 開發時,隨著程式碼越來越多,會希望把不同應用的函示都給分類出來,方便日後的擴充和維護,因此 Python 提供了一種模式,來讓你把所定義的函式單獨放在檔案當中,而該檔案也被稱為「Module 模組」。
__name__
:__name__
為 Module 內建的變數,定義了此模塊的名稱是什麼,主要進入點的模塊名稱會是 __main__
,而其餘的模塊名稱就是原本的檔案名。假如有兩個檔案分別為 original.py
和 functions.py
,如果今天主要進入點為 original.py
,則其模塊名稱會為 __main__
,而其他的會保持原先的檔案名,也就是 functions
。
__name__ = "__main__"
:根據 Python 特性的第二點可以了解到,不僅主要進入口的程式碼會上到下執行,連模塊的程式碼也會,以下為程式碼說明:
# functions.py
def hello():
print("hello")
hello()
# original.py
import functions
functions.hello()
若 original.py
為主要的進入口,依照最直接的邏輯其結果會為以下:
hello
但若依照上面的程式碼真實執行過會發現到其實真正的結果會是:
hello
hello
而造成其最主要的差異是因為前面所提到 Python 的特性,不僅主要進入口的程式碼會由上到下被執行,連模塊的也會,因此在 original.py
中,不僅會讀進 def hello()
此函式,連 hello()
的使用也會被讀進去,而這也是為什麼需要 __name__ = "__main__"
。
__name__ = "__main__"
:由以上例子可知,引進的模塊一樣會由上到下被執行,但有時可能只是要測試該函式的運作才使用該函式,被引進時並不是真的需要其運行,因此我們可以改成以下的程式碼:
# functions.py
def hello():
print("hello")
if __name__ = "__main__":
hello()
以上代表了當 functions.py
為主要進入口時,才執行 hello()
此函式,因此就可以避免剛剛的結果,若在執行一次上面的程式碼即可得到以下結果:
hello