一篇文章徹底弄懂Python中的if?__name__?==?__main__
1. 引言
在Python相關(guān)代碼中,我們經(jīng)常會(huì)遇到如下代碼段:
# stuff
if __name__ == "__main__":
# do stuff
本文將盡可能使用簡(jiǎn)單的樣例來解釋這里發(fā)生了什么,以及需要使用if __name__=="__main__"的情形。請(qǐng)注意,上述代碼中name和main前后有2個(gè)下劃線字符。
閑話少說,我們直接開始吧!
2. 特殊變量
當(dāng)我們正常運(yùn)行我們的Python腳本時(shí),該腳本中的變量__name__的值一般為__main__。我們來看個(gè)示例:
# first.py print(__name__)
我們?cè)诮K端中運(yùn)行上述腳本,代碼如下:
python first.py
輸出如下:
__main__
觀察上述輸出,當(dāng)我們運(yùn)行腳本first.py的時(shí)候,變量__name__的值被設(shè)置為__main__。
3. 復(fù)雜的例子
上述示例相對(duì)簡(jiǎn)單,也相對(duì)容易理解。接著我們來舉個(gè)具有多個(gè)文件的例子,這里假設(shè)我們有三個(gè)腳本,分別為a.py,b.py以及c.py。
其中,a.py的內(nèi)容如下:
# a.py
print("__name__ in a.py:", __name__)
from b import *
from c import *
此時(shí),b.py的內(nèi)容如下:
# b.py
print("__name__ in b.py:", __name__)
c.py的內(nèi)容如下:
# c.py
print("__name__ in c.py:", __name__)
如果我們運(yùn)行命令python a.py得到結(jié)果如下:
__name__ in a.py: __main__
__name__ in b.py: b
__name__ in c.py: c
注意在腳本a.py中我們看到__name__的值為__main__,此時(shí)在腳本b.py中__name__的值為b, 同時(shí) c.py中__name__的值為c。這是因?yàn)槲覀冞\(yùn)行的腳本為a.py,那么該腳本即a.py中變量__name__的值將會(huì)被設(shè)置為字符串__main__.
此外,腳本b.py和c.py中的變量·__name__分別保持為b和c,這是因?yàn)槟_本b.py和c.py不是直接運(yùn)行的腳本。而是我們運(yùn)行的腳本a.py調(diào)用了b.py和c.py中的print函數(shù)。
如果我們單獨(dú)運(yùn)行python b.py得到結(jié)果如下:
__name__ in b.py: __main__
相應(yīng)的我們運(yùn)行python c.py,得到結(jié)果如下:
__name__ in c.py: __main__
觀察上述兩個(gè)輸出,當(dāng)我們直接運(yùn)行腳本b.py或c.py,相應(yīng)的腳本里的變量__name__都將被設(shè)置為__main__。
4. 使用場(chǎng)景
作為Python開發(fā)者,我們通常會(huì)在一個(gè)項(xiàng)目工程中創(chuàng)建多個(gè)Python文件而不是將所有代碼都寫在一個(gè)Python文件中。因此我們通常會(huì)有一個(gè)主的Python文件用來作為項(xiàng)目工程的入口,同時(shí)其他文件包含一些輔助性的函數(shù)實(shí)現(xiàn)。
我們來看個(gè)示例,這里假設(shè)我們有兩個(gè)Python文件,如下:
# main.py
from helper import *
print(greet("bob"))
輔助函數(shù)實(shí)現(xiàn) helper.py內(nèi)容如下:
# helper.py
def greet(name):
return "hello " + name
print(greet("testname"))
如果此時(shí)我們運(yùn)行命令 python main.py,得到結(jié)果如下:
hello bob
hello testname
主要上述的import語(yǔ)句將從helper.py中引入所有的語(yǔ)句,所以helper.py中的測(cè)試語(yǔ)句print(greet("testname"))也將被執(zhí)行。雖然我們可以通過添加注釋或者屏蔽注釋來達(dá)到運(yùn)行main.py或helper.py來控制該測(cè)試語(yǔ)句的輸出,但是這種情形就是語(yǔ)句if __name__=="__main__" 大顯身手的情形。
5. 解決方案
我們針對(duì)上述情形,進(jìn)行代碼整改,如下:
# main.py
from helper import *
print(greet("bob"))
我們修改文件 helper.py內(nèi)容如下:
def greet(name):
return "hello " + name
if __name__ == "__main__":
print(greet("testname"))
此時(shí),我們執(zhí)行命令python main.py,得到結(jié)果如下:
hello bob
注意,此時(shí)helper.py 中的變量 __name__的值為helper, 所以helper.py中的if語(yǔ)句不成立,進(jìn)而將不會(huì)執(zhí)行我們的測(cè)試語(yǔ)句print(greet("testname")).
此時(shí),如果我們單獨(dú)運(yùn)行命令python helper.py ,得到結(jié)果如下:
hello testname
單獨(dú)運(yùn)行helper.py時(shí),此時(shí)改腳本中的變量__name__將被設(shè)置為__main__,所以此時(shí)的測(cè)試語(yǔ)句將會(huì)被執(zhí)行,輸出相應(yīng)的測(cè)試結(jié)果。
6. 總結(jié)
本文重點(diǎn)介紹了Python中常見的if __name__=="__main__" ,重點(diǎn)分析了其背后的原理和應(yīng)用的場(chǎng)景。
到此這篇關(guān)于Python中if __name__ == __main__的文章就介紹到這了,更多相關(guān)Python中if __name__ == __main__內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中if __name__ == "__main__"詳細(xì)解釋
- 正確理解Python中if __name__ == ''__main__''
- Python中if?__name__==‘__main__‘用法詳情
- Python中if __name__ == ''__main__''作用解析
- 聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么
- 關(guān)于Python中的if __name__ == __main__詳情
- 深入理解python中if?__name__?==?‘__main__‘
- Python中if __name__ == “__main__“的作用總結(jié)
相關(guān)文章
Python實(shí)現(xiàn)隨機(jī)森林回歸與各自變量重要性分析與排序
這篇文章主要為大家詳細(xì)介紹了在Python環(huán)境中,實(shí)現(xiàn)隨機(jī)森林(Random Forest,RF)回歸與各自變量重要性分析與排序的過程,感興趣的小伙伴可以了解一下2023-02-02
使用virtualenv創(chuàng)建Python環(huán)境及PyQT5環(huán)境配置的方法
這篇文章主要介紹了使用virtualenv創(chuàng)建Python環(huán)境及PyQT5環(huán)境配置的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
Python數(shù)據(jù)分析23種Pandas核心操作方法總結(jié)
在本文中,作者從基本數(shù)據(jù)集讀寫、數(shù)據(jù)處理和?DataFrame?操作三個(gè)角度展示了?23?個(gè)?Pandas?核心方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python2 與 pyhton3的輸入語(yǔ)句寫法小結(jié)
這篇文章主要給大家介紹了關(guān)于python2 與 pyhton3的輸入語(yǔ)句寫法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
淺談Matplotlib簡(jiǎn)介和pyplot的簡(jiǎn)單使用——文本標(biāo)注和箭頭
這篇文章主要介紹了淺談Matplotlib簡(jiǎn)介和pyplot的簡(jiǎn)單使用——文本標(biāo)注和箭頭,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
解決Pycharm 包已經(jīng)下載,但是運(yùn)行代碼提示找不到模塊的問題
今天小編就為大家分享一篇解決Pycharm 包已經(jīng)下載,但是運(yùn)行代碼提示找不到模塊的問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
tensorflow dataset.shuffle、dataset.batch、dataset.repeat順序區(qū)別詳
這篇文章主要介紹了tensorflow dataset.shuffle、dataset.batch、dataset.repeat順序區(qū)別詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2020-06-06

