Python中if?__name__?==?“__main__“的作用總結(jié)
這行代碼在Python中非常常見,它的作用是:判斷當(dāng)前模塊是否被直接運(yùn)行,而不是被導(dǎo)入到其他模塊中。
語法解析
if __name__ == "__main__":
# 這里的代碼只在直接運(yùn)行該文件時執(zhí)行
main()
__name__是Python的一個內(nèi)置變量- 當(dāng)文件被直接運(yùn)行時,
__name__的值為"__main__" - 當(dāng)文件被導(dǎo)入時,
__name__的值為模塊名(文件名)
不加它會有什么問題?
1. 模塊被導(dǎo)入時執(zhí)行不必要的代碼
沒有使用 if __name__ == "__main__": 的情況:
# module.py
def useful_function():
print("這是一個有用的函數(shù)")
print("模塊被加載了!") # 這行在導(dǎo)入時就會執(zhí)行
useful_function() # 這也會在導(dǎo)入時執(zhí)行
# 另一個文件:main.py
import module # 導(dǎo)入時就會立即打印"模塊被加載了!"并執(zhí)行函數(shù)
使用 if __name__ == "__main__": 的情況:
# module.py
def useful_function():
print("這是一個有用的函數(shù)")
if __name__ == "__main__":
print("模塊被直接運(yùn)行!")
useful_function()
# main.py
import module # 不會執(zhí)行任何打印,除非顯式調(diào)用 module.useful_function()
2. 測試代碼會被意外執(zhí)行
# 沒有保護(hù)的情況
def add(a, b):
return a + b
# 測試代碼
result = add(2, 3) # 導(dǎo)入時就會執(zhí)行測試!
print(f"測試結(jié)果: {result}")
# 有保護(hù)的情況
def add(a, b):
return a + b
if __name__ == "__main__":
# 測試代碼只在直接運(yùn)行時執(zhí)行
result = add(2, 3)
print(f"測試結(jié)果: {result}")
3. 初始化操作無法控制
# 不好的寫法
print("程序啟動中...")
initialize_database() # 導(dǎo)入時就會初始化數(shù)據(jù)庫!
start_web_server()
# 好的寫法
def main():
print("程序啟動中...")
initialize_database()
start_web_server()
if __name__ == "__main__":
main() # 只有直接運(yùn)行時才啟動程序
最佳實(shí)踐
def function1():
pass
def function2():
pass
def main():
"""主函數(shù),包含程序的主要邏輯"""
function1()
function2()
if __name__ == "__main__":
# 這里可以添加命令行參數(shù)解析、異常處理等
main()
總結(jié)
不加 if __name__ == "__main__": 的主要問題是:
- 模塊被導(dǎo)入時會執(zhí)行測試代碼和初始化代碼
- 代碼的可重用性降低
- 可能出現(xiàn)意外的副作用
加上它可以確保:
- 模塊既可以作為腳本直接運(yùn)行
- 也可以被其他模塊安全導(dǎo)入
- 提高了代碼的模塊化和可重用性
在Python中,if __name__ == "__main__": 這行代碼用于檢查當(dāng)前模塊是否被直接運(yùn)行,而不是被導(dǎo)入到其他模塊中。
解釋:
每個Python模塊(一個.py文件)都有一個內(nèi)置的變量__name__。
當(dāng)模塊被直接執(zhí)行時,__name__的值被設(shè)置為"__main__"。
當(dāng)模塊被導(dǎo)入到其他模塊時,__name__的值則是模塊的名字(即文件名,不帶.py后綴)。
因此,這行代碼下面的代碼塊只會在該模塊被直接運(yùn)行時執(zhí)行,而當(dāng)該模塊被導(dǎo)入時不會執(zhí)行。
不加它的問題:
如果這個模塊既可以被其他模塊導(dǎo)入使用,也可以直接運(yùn)行,那么沒有這個條件判斷,當(dāng)被導(dǎo)入時,那些不希望被執(zhí)行的代碼(例如測試代碼、主程序等)也會被執(zhí)行,這可能導(dǎo)致意想不到的行為。
通常,我們將模塊的主要功能封裝成函數(shù)或類,然后在if name == “main”:下面調(diào)用這些函數(shù)或類來運(yùn)行程序。這樣,當(dāng)模塊被導(dǎo)入時,這些調(diào)用不會執(zhí)行,而模塊中的函數(shù)和類可以被其他模塊使用。
示例:
假設(shè)我們有一個模塊mymodule.py,內(nèi)容如下:
def my_function():
print("Hello from my_function!")
print("This is a top-level print statement")
if __name__ == "__main__":
print("This code runs only when the module is executed directly")
my_function()
情況1:直接運(yùn)行mymodule.py
輸出:
This is a top-level print statement This code runs only when the module is executed directly Hello from my_function!
情況2:在另一個模塊中導(dǎo)入mymodule:
import mymodule
輸出:
This is a top-level print statement
可以看到,不加條件判斷的print語句在導(dǎo)入時也會執(zhí)行,而條件判斷內(nèi)的代碼只在直接運(yùn)行時執(zhí)行。
因此,使用if __name__ == "__main__":可以讓我們寫出既可以被導(dǎo)入又可以直接運(yùn)行的模塊,并且不會在導(dǎo)入時執(zhí)行不必要的代碼。
到此這篇關(guān)于Python中if __name__ == “__main__“作用總結(jié)的文章就介紹到這了,更多相關(guān)Python中if __name__ == “__main__“內(nèi)容請搜索腳本之家以前的文章或繼續(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__‘
相關(guān)文章
django注冊用郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了django注冊用郵箱發(fā)送驗(yàn)證碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
解決CentOS下ImportError: No module named &a
這篇文章主要介紹了解決CentOS下ImportError: No module named '_sqlite3'的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
PyQT5 QTableView顯示綁定數(shù)據(jù)的實(shí)例詳解
今天小編就為大家分享一篇PyQT5 QTableView顯示綁定數(shù)據(jù)的實(shí)例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Scrapy框架爬取西刺代理網(wǎng)免費(fèi)高匿代理的實(shí)現(xiàn)代碼
今天小編就為大家分享一篇關(guān)于Scrapy框架爬取西刺代理網(wǎng)免費(fèi)高匿代理的實(shí)現(xiàn)代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02
Python?PySpark案例實(shí)戰(zhàn)教程
PySpark是由Spark官方開發(fā)的Python語言第三方庫,Python開發(fā)者可以使用pip程序快速的安裝PySpark并像其它三方庫那樣直接使用,本文給大家介紹Python?PySpark案例實(shí)戰(zhàn),感興趣的朋友一起看看吧2023-09-09

