網站首頁 編程語言 正文
簡述
經常,會在 Python 模塊中看到 if __name__ == '__main__':
這樣的代碼,究竟有什么作用呢?
有句話經典地概括了這段代碼的意義:
Make a script both importable and executable
意思是說:模塊既可以被導入(到 Python shell 或者其他模塊中),也可以作為腳本來執行。
| 版權聲明:一去、二三里,未經博主允許不得轉載。
__name__
屬性
所有模塊都有一個內置的屬性 __name__
,__name__
的值取決于如何使用這個模塊。
例如,有一個名為 calc.py
的模塊,包含以下代碼:
print('__name__:', __name__)
當導入模塊時,__name__
是模塊的文件名:
>>> import calc
__name__: calc
但是,如果將其作為腳本使用,__name__
就是一個特殊的值 __main__
:
$ python calc.py
__name__: __main__
由此,可以得出一個結論:當模塊被導入時,模塊名稱是文件名;而當模塊作為腳本獨立運行時,名稱為 __main__
。
讓模塊既可以導入又可以執行
回到最初的問題:if __name__ == '__main__':
?
通過上面的結論,可以推斷出:只有當模塊直接運行(即:不導入)時,才會執行 if
塊內的代碼。
修改一下 calc.py
模塊,內容如下:
def add(a, b):
return a + b
print('test: 2 + 3 =', add(2, 3))
將其作為模塊導入:
>>> import calc
test: 2 + 3 = 5
再將其作為腳本來執行:
$ python calc.py
test: 2 + 3 = 5
顯然,無論使用哪種方式,都會執行打印語句。
如果模塊只會被用作腳本,那沒什么問題,但若希望將其作為一個導入模塊時,往往不想打印出測試用例。在這種情況下,__name__
就派上用場了。
完善 calc.py
模塊,為其添加一個 if
語句:
def add(a, b):
return a + b
if __name__ == '__main__':
print('test: 2 + 3 =', add(2, 3))
這時,再導入模塊,不會執行任何打印語句:
>>> import calc
>>>
而將其作為腳本直接運行,卻可以正常打印:
$ python calc.py
test: 2 + 3 = 5
這就是 __name__
的神奇之處,可以利用這個特性為模塊提供用戶界面,或對模塊進行測試(將模塊作為腳本運行,來執行測試用例)。
通用形式
實際上,在 Python 中,一個名為 main
的函數沒有任何特殊的作用。
然而,通常的做法是在 main
函數中組織一個程序的主要功能,并使用類似于以下代碼進行調用:
def main():
try:
doMainthing()
return 0
except:
return 1
if __name__ == "__main__":
sys.exit(main())
sys.exit()
用于退出程序,其中 0 表示正常退出,其他值表示異常退出。
原文鏈接:https://waleon.blog.csdn.net/article/details/75081689
相關推薦
- 2022-10-01 Qt?timerEvent實現簡單秒表功能_C 語言
- 2022-09-02 C#中ftp檢測目錄是否存在和創建文件夾的實現_C#教程
- 2021-12-18 linux下安裝redis圖文詳細步驟_Redis
- 2022-07-26 瀏覽器解析機制和XSS向量編碼
- 2022-09-15 Python實現圖形用戶界面計算器_python
- 2022-10-30 詳解Objective?C?中Block如何捕獲外部值_IOS
- 2022-12-15 Qt開發之使用socket實現遠程控制_C 語言
- 2022-06-06 Postgresql split_part()函數,根據符號切割字符串
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支