有句話經典的歸納了這段代碼的意義:函數
「Make a script both importable and executable」spa
意思就是說讓你寫的腳本模塊既能夠導入到別的模塊中用,另外該模塊本身也可執行。.net
這句話,可能一開始聽的還不是很懂。下面舉例說明:調試
先寫一個模塊:code
1
2
3
4
5
|
#module.py
def
main():
print
"we are in %s"
%
__name__
if
__name__
=
=
'__main__'
:
main()
|
這個函數定義了一個main函數,咱們執行一下該py文件發現結果是打印出」we are in __main__「,說明咱們的if語句中的內容被執行了,調用了main():htm
可是若是咱們從另我一個模塊導入該模塊,並調用一次main()函數會是怎樣的結果呢?ip
1
2
3
|
#anothermodle.py
from
module
import
main
main()
|
其執行的結果是:we are in moduleci
可是沒有顯示」we are in __main__「,也就是說模塊__name__ = '__main__' 下面的函數沒有執行。get
這樣既能夠讓「模塊」文件運行,也能夠被其餘模塊引入,並且不會執行函數2次。這纔是關鍵。string
總結一下:
若是咱們是直接執行某個.py文件的時候,該文件中那麼」__name__ == '__main__'「是True,可是咱們若是從另一個.py文件經過import導入該文件的時候,這時__name__的值就是咱們這個py文件的名字而不是__main__。
這個功能還有一個用處:調試代碼的時候,在」if __name__ == '__main__'「中加入一些咱們的調試代碼,咱們能夠讓外部模塊調用的時候不執行咱們的調試代碼,可是若是咱們想排查問題的時候,直接執行該模塊文件,調試代碼可以正常運行!