【Python】if name == '__main__'究竟有什么作用?
1前言
在很多的源碼中,我們經(jīng)常可以看到有一句話
if __name__ == '__main__':
但是我們?cè)谶\(yùn)行的時(shí)候,又會(huì)發(fā)現(xiàn)把這句話刪掉的時(shí)候卻又不影響代碼的執(zhí)行,那為什么要加這么一句話呢?
本文將進(jìn)一步介紹“if name == '__main__'”這命令的含義,以及在實(shí)際項(xiàng)目中如何應(yīng)用。
2__name__的作用
python的變量中,分別有單下劃線_xxx,雙下劃線__xxx,以及變量前后均有雙下劃線__xxx__
系統(tǒng)定義名字,一般前后均有一個(gè)“雙下劃線”來代表python里特殊方法專用的標(biāo)識(shí),如__init__0代表類的構(gòu)造函數(shù)。類似__xxx__這樣的變量一般是特殊變量,可以被直接引用,但是有特殊用途,而__name__就是這樣一個(gè)特殊變量,它是python的一個(gè)內(nèi)置類屬性,它天生就存在于一個(gè) python 程序中。
1.當(dāng)我們直接運(yùn)行python程序時(shí),程序的__name__就是等于'__main__'
有程序腳本“A.py”,代碼如下,
def myfun1():
print('從A中調(diào)用myfun1')
print('A_name:', __name__)
myfun1()
直接執(zhí)行代碼,得到結(jié)果輸出:

2.當(dāng)我們運(yùn)行python程序?qū)肫渌?py文件時(shí),導(dǎo)入其他文件的__name__就是等于模塊名
除A.py外,我們有另一腳本run_code.py,我們使用它來調(diào)用A.py,此處我們直接import A即可
import A
我們看看輸出:

可以看到輸出的形式基本就是一致的,但不一樣的是__name__不再等于'__main__'而是為文件名字“A”。
3 if __name__=='__main__'在項(xiàng)目的應(yīng)用
值得注意的是,我們剛剛并沒有使用A.py中的函數(shù),只是import,python也會(huì)輸出結(jié)果。讓我們?cè)俅位仡櫸覀兊膬蓚€(gè)腳本:
A.py
def myfun1():
print('從A中調(diào)用myfun1')
print('A_name:', __name__)
myfun1()
run_code.py
import A實(shí)際上,即使我們import A,同樣也會(huì)把A的腳本執(zhí)行。那么,如果我們?cè)趓un_code.py腳本中調(diào)用函數(shù)會(huì)得到什么結(jié)果?我們把run_code.py修改如下:
import A
print('從run_code中調(diào)用myfun1')
A.myfun1()
輸出結(jié)果如下:

接下來,我們分析每個(gè)輸出的出處。
第一句及第二句輸出,是由于import A過程中,執(zhí)行A.py腳本中的“myfun1()”函數(shù)得到的,所以得到:
從A中調(diào)用myfun1
A_name: A
第三句輸出,則是run_code.py腳本中的命令“print('從run_code中調(diào)用myfun1')”得到的輸出
從run_code中調(diào)用myfun1
第四句及第五句輸出,則是從run_code.py腳本中的命令“A.myfun1()”執(zhí)行A中的“myfun1()”函數(shù)得到的輸出
從A中調(diào)用myfun1
A_name: A
實(shí)際上,A.py這個(gè)文件本來只是一個(gè)函數(shù)文件,A.py中“myfun1()”這個(gè)命令,是我們?cè)谧珜戇@個(gè)函數(shù)的時(shí)候的測(cè)試命令,那么這就產(chǎn)生一個(gè)問題,當(dāng)我們?cè)谄渌绦蛑姓{(diào)用這個(gè)模塊的時(shí)候,這一句測(cè)試內(nèi)容就會(huì)被打印出來。
我們當(dāng)然可以把上面的測(cè)試語句刪除,但是一般情況下,我們后續(xù)可能還會(huì)對(duì)原始的代碼進(jìn)行修改,那么修改后,這些測(cè)試代碼又要重新被添加上,那么就顯得有點(diǎn)麻煩了。
那么在這種情況下,我們就可以在這些測(cè)試代碼前加上:
if __name__ == '__main__':
根據(jù)我們前面討論__name__的特性,就可以使得我們?cè)跍y(cè)試的時(shí)候,運(yùn)行測(cè)試語句,而當(dāng)我們調(diào)用的時(shí)候,不再運(yùn)行這些測(cè)試語句。
我們對(duì)A.py進(jìn)行改寫:
def myfun1():
print('從A中調(diào)用myfun1')
print('A_name:', __name__)
#myfun1()
if __name__ == '__main__':#當(dāng)作為模塊被導(dǎo)入時(shí),不執(zhí)行
myfun1()
執(zhí)行輸出結(jié)果有:

run_code.py不用修改?,F(xiàn)在,我們?cè)賵?zhí)行run_code.py

可以發(fā)現(xiàn),測(cè)試的語句已經(jīng)沒有再被輸出了。
4 總結(jié)
初始接觸python的時(shí)候,我們往往困惑“if name == '__main__'”這句似乎沒有任何作用的語句為什么要加上去。但是相信經(jīng)過上面的講解,大家也對(duì)python的模塊管理有了更深刻的認(rèn)識(shí),也明白在實(shí)際使用中,我們?cè)撊绾芜\(yùn)用“if name == '__main__'”這個(gè)語句了。
剛接觸Python,練習(xí)編寫的程序/模塊通常是直接運(yùn)行,該語句沒有起到實(shí)質(zhì)性的作用。因此會(huì)對(duì)其作用有些困惑。有模塊的概念,自己嘗試做一些模塊封裝,就會(huì)很好理解了。
3.使用watch窗口添加關(guān)注變量
往期精彩回顧
適合初學(xué)者入門人工智能的路線及資料下載 (圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載 機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印 《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼
