1. 程式人生 > >python if __name__ == '__main__': 的解析

python if __name__ == '__main__': 的解析

前言:
模組的定義:在Python中,一個.py檔案就稱為一個模組(Module)。
模組的好處:
最大的好處是大大提高了程式碼的可維護性。
其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方所引用。再者,使用模組還可以避免函式名和變數名衝突。

內建屬性__name__
模組是物件,並且所有的模組都有一個內建屬性 __name__
一個模組的__name__ 的值取決於如何應用模組。
如果 import 一個模組,那麼模組name 的值通常為模組檔名,不帶路徑或者副檔名。
也可以像一個標準的程式樣直接執行模組,在這種情況下, name

的值將是一個特別預設__main__

  • 直接執行.py檔案
practice.py
def main():
    print "we are in %s" % __name__
main()

輸出結果為:we are in __main__
  • import 一個.py檔案後
# anothermodle.py
from practice import main
main()
輸出結果為:we are in practice
  • __name__==__main__ 的作用
    有句話經典的概括了這段程式碼的意義:
    “Make a script both importable and executable”
    意思就是說讓你寫的指令碼模組既可以匯入到別的模組中用,另外該模組自己也可執行。
practice.py
def main():
    print "we are in %s" % __name__
if __name__ == '__main__':
    main()
輸出:we are in __main__

依據內建屬性 __name__

  • 當直接執行某個.py檔案的時候,該檔案中那麼__name__ == '__main__'是True,main()函式被執行
  • 當從另外一個.py檔案通過import匯入該檔案的時候,這時name的值就是這個py檔案的名字而不是mainif __name__ == '__main__'內的內容不會執行。

這個功能還有一個用處:除錯程式碼的時候,在 if __name__ == '__main__'中加入一些我們的除錯程式碼,我們可以讓外部模組呼叫的時候不執行我們的除錯程式碼,但是如果我們想排查問題的時候,直接執行該模組檔案,除錯程式碼能夠正常執行!