更新時(shí)間:2022-08-17 來(lái)源:黑馬程序員 瀏覽量:
在前面介紹with語(yǔ)句時(shí),提到了一個(gè)非常重要的概念,即上下文管理器。要想使用with語(yǔ)句,前提就是要有上下文管理器。上下文管理器是Python2.5開始支持的一種語(yǔ)法,用于規(guī)定某個(gè)對(duì)象的使用范圍,一旦進(jìn)入或者離開使用范圍,會(huì)有特殊的操作被調(diào)用。
下面來(lái)介紹與上下文管理器有關(guān)的概念。
1.上下文管理協(xié)議
包含_enter_()和_exit_()方法,支持該協(xié)議的對(duì)象要實(shí)現(xiàn)這兩個(gè)方法。關(guān)于這兩個(gè)方法的介紹如下。
·_enter_(self):進(jìn)入上下文管理器時(shí)調(diào)用此方法,其返回值被放入with-as語(yǔ)句中as說(shuō)明符指定的變量中。
·_exit_(self,type,value,tb):離開上下文管理器調(diào)用此方法。如果有出現(xiàn)異常,type、value、tb分別為異常的類型、值和追蹤信息;如果沒有異常,3個(gè)參數(shù)均設(shè)為None。此方法返回值為True或False,分別指示被引發(fā)的異常得到了還是沒有得到處理,如果返回False,引發(fā)的異常會(huì)被傳遞出上下文。
2.上下文管理器
支持上下文管理協(xié)議的對(duì)象,用于實(shí)現(xiàn)_enter_()和_exit_()方法。上下文管理器定義執(zhí)行with語(yǔ)句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with語(yǔ)句塊上下文中的進(jìn)入與退出操作。
3.運(yùn)行時(shí)上下文
由上下文管理協(xié)議的對(duì)象,用于實(shí)現(xiàn)_enter_()和_exit_()方法實(shí)現(xiàn)。
4.上下文表達(dá)式
with語(yǔ)句中在關(guān)鍵字with之后的表達(dá)式,該表達(dá)式要返回一個(gè)支持上下文管理協(xié)議的對(duì)象。
在了解上下文管理器之后,就能很好地理解with語(yǔ)句的整個(gè)執(zhí)行過(guò)程了,具體如下:
(1)首先執(zhí)行上下文表達(dá)式,生成一個(gè)上下文管理器對(duì)象;
(2)調(diào)用上下文管理器的_enter_()方法,如果使用了as子句,就把_enter_()方法的返回值賦值給as子句中的資源對(duì)象;
(3)執(zhí)行with語(yǔ)句包裹的代碼塊;
(4)無(wú)論在執(zhí)行的過(guò)程中是否發(fā)生異常,都會(huì)執(zhí)行上下文管理器的_exit_()方法。該方法負(fù)責(zé)執(zhí)行程序的“清理”工作,如釋放資源等;
(5)如果執(zhí)行過(guò)程中沒有出現(xiàn)異常,或者代碼中執(zhí)行了break、continue或者return語(yǔ)句,則以None作為參數(shù)調(diào)用_exit_()方法,如果在執(zhí)行過(guò)程中出現(xiàn)異常,則會(huì)使用sys.exc_info得到的異常信息為參數(shù)調(diào)用_exit_()方法;
(6)出現(xiàn)異常時(shí),如果_exit_()方法返回的結(jié)果為False,則會(huì)重新拋出異常,讓with之外的語(yǔ)句邏輯來(lái)處理異常,這是通用做法;如果返回True,則忽略異常,不再對(duì)異常進(jìn)行處理。
Python培訓(xùn):if-elif語(yǔ)句用法
2022-08-17為什么說(shuō)優(yōu)化器是數(shù)據(jù)庫(kù)的核心?
2022-08-16TiDB-讀取歷史數(shù)據(jù)的操作流程
2022-08-16什么是Kerberos?Kerberos如何做身份認(rèn)證?
2022-08-15認(rèn)識(shí)電商數(shù)據(jù)分析【Python大數(shù)據(jù)培訓(xùn)】
2022-08-15數(shù)據(jù)分析的常見誤區(qū)有哪些?【Python大數(shù)據(jù)培訓(xùn)】
2022-08-12