主程式碼通常都和你前面看到的代碼相似,檢查 __name__ 變數的值然後再執行相應的調用(參閱下一頁的核心筆記)。主程式中的代碼通常包括變數賦值, 類定義和函數定義,隨後檢查__name__來決定是否調用另一個函數(通常調用main()函數)來完成該模組的功能。主程式通常都是做這些事。(我們上面的例子中使用test()而不是main()是為了避免你在讀到核心筆記前感到迷惑。) 不管用什麼名字,我們想強調一點那就是:這兒是放置測試代碼的好地方。我們在3.4.2 小節中曾經說過,大部分的Python 模組都是用於匯入調用的,直接運行模組應該調用該模組的迴歸測試代碼。
由於主程式碼無論模組是被匯入還是被直接執行都會運行, 我們必須知道模組如何決定運行方向。一個應用程式可能需要匯入另一個應用程式的一個模組,以便重用一些有用的代碼(否則就只能用拷貝粘貼那種非物件導向的愚蠢手段)。這種情況下,你只想訪問那些位於其它應用程式中的代碼,而不是想運行那個應用程式。因此一個問題出現了,“Python 是否有一種方法能在運行時檢測該模組是被匯入還是被直接執行呢?” 答案就是......(鼓聲雷動).....沒錯! __name__ 系統變數就是正確答案。
如果模組是被匯入, __name__ 的值為模組名字
如果模組是被直接執行, __name__ 的值為 '__main__'
所有的 Python
模組都是對象並且有幾個有用的屬性。 您可以使用這些屬性方便地測試您所書寫的模組。 下面是一個使用 if
__name__
的技巧。
if __name__ == "main":
在繼續學習新東西之前, 有幾點重要的觀察結果。 首先, if
運算式無需使用圓括弧括起來。 其次, if
語句以冒號結束, 隨後跟隨的是縮排代碼。
與 C
一樣, Python
使用 ==
做比較, 使用 =
做賦值。 與 C
不一樣, Python
不支援行內賦值, 所以不會出現想要進行比較卻意外地出現賦值的情況。
那麼為什麼說這個特殊的 if
語句是一個技巧呢?模組是對象, 並且所有的模組都有一個內建屬性 __name__
。一個模組的 __name__
的值要看您如何應用模組。如果 import
模組, 那麼 __name__
的值通常為模組的檔案名稱, 不帶路徑或者副檔名。但是您也可以像一個標準的程式一樣直接運行模組, 在這種情況下 __name__
的值將是一個特別的預設值, __main__
。
>>> import odbchelper>>> odbchelper.__name__'odbchelper'
一旦瞭解到這一點, 您可以在模組內部為您的模組設計一個測試套件, 在其中加入這個 if
語句。當您直接運行模組, __name__
的值是 __main__
, 所以測試套件執行。當您匯入模組, __name__
的值就是別的東西了, 所以測試套件被忽略。這樣使得在將新的模組整合到一個大程式之前開發和調試容易多了。