背景
在寫Python代碼和看Python代碼時,我們常??梢钥吹竭@樣的代碼:
def main():
......
if __name == "main":
main();
其中的函數(shù)名main,也可以是其他任意的,你所設置的名字。
這里,就出現(xiàn)了,我們此處所要解釋的
name和main
用代碼來演示name和main的含義和用法
文字解釋,還是很容易糊涂的,下面就來借用一個這里:
What is ‘if name == “main”‘ for?
的代碼來詳細解釋一下。
作為普通的代碼,我們是可以這么寫的:

對應的,運行結果也是很正常的:

但是呢,往往我們所見到的,和我們以后自己也會遇到的,自己寫的,有條理的,可復用的做法,那肯定是
那對應的square等函數(shù),專門放到一個文件中,然后被別人調(diào)用,此時,就是這樣的:
對應的模塊文件是mymath.py,里面有我們實現(xiàn)的函數(shù)square:

然后別的python文件name___and___main.py中,導入此mymath模塊,然后使用其square函數(shù):

然后運行結果是:

此處,我們看到了,也同時出現(xiàn)了,原本用于mymath.py中去測試square函數(shù)的打印結果:
test: square(42) == 1764
而這樣的內(nèi)容,很明顯,是作為我模塊的調(diào)用者,不希望看到的。也不關心的。
此時,我們所希望的是:
作為模塊mymath.py本身,希望有自己的相關的調(diào)試的代碼,用于調(diào)試自己模塊函數(shù),演示如何使用等等代碼;
但是又不希望在被別的,本模塊的調(diào)用者,所執(zhí)行到,所看到;
此時,就可以用上述的main來實現(xiàn)了:
把mymath.py改為:

此時:
- 作為mymath.py本身,自己運行時,可以運行到此處的代碼,調(diào)試,驗證自己的函數(shù)square執(zhí)行的是否正確:

2.同時,作為mymath.py的調(diào)用者name___and___main.py,在import mymath的時候,也不會看到對應的代碼執(zhí)行的結果了:

其中的main,就是:
作為模塊mymath.py本身:
作為腳本自己去運行的話,對應的模塊名,就是上面所解釋的,始終叫做main
關于這點,上述代碼已經(jīng)驗證過了。因為mymath.py中的name,就是對應的,內(nèi)置的變量,通過判斷,的確是main,然后才會去執(zhí)行到對應的模塊的測試代碼的。
如果被當做一個模塊被別人調(diào)用的時候,對應的模塊mymath.py的模塊名,就是mymath;
關于這點,我們可以來驗證一下,把name___and___main.py改為:

再去運行,就可以看到輸出的結果是mymath了:

示例2
另外,這里:
A Byte of Python – A module’s name
也有個例子,相對更加簡潔,需要的可以參考一下。
摘錄其代碼如下:

【總結】
name:表示模塊,類等的名字;
main:模塊,xxx.py文件本身:
被直接執(zhí)行時,對應的模塊名就是main了
可以在
if name == “main”:
中添加你自己想要的,用于測試模塊,演示模塊用法等代碼。
作為模塊,被別的Python程序?qū)耄╥mport)時,模塊名就是本身文件名xxx了。
總的來說,即:
python文件本身自己運行時,顯示的是:This program is being run by itself
Python文件被別人import導入時,顯示的是:I am being imported from another module