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