首頁常見問題正文

Python培訓(xùn):上下文管理器

更新時間:2022-08-17 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  在前面介紹with語句時,提到了一個非常重要的概念,即上下文管理器。要想使用with語句,前提就是要有上下文管理器。上下文管理器是Python2.5開始支持的一種語法,用于規(guī)定某個對象的使用范圍,一旦進入或者離開使用范圍,會有特殊的操作被調(diào)用。

  下面來介紹與上下文管理器有關(guān)的概念。

  1.上下文管理協(xié)議

  包含_enter_()和_exit_()方法,支持該協(xié)議的對象要實現(xiàn)這兩個方法。關(guān)于這兩個方法的介紹如下。

  ·_enter_(self):進入上下文管理器時調(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語句塊上下文中的進入與退出操作。

  3.運行時上下文

  由上下文管理協(xié)議的對象,用于實現(xiàn)_enter_()和_exit_()方法實現(xiàn)。

  4.上下文表達式

  with語句中在關(guān)鍵字with之后的表達式,該表達式要返回一個支持上下文管理協(xié)議的對象。

  在了解上下文管理器之后,就能很好地理解with語句的整個執(zhí)行過程了,具體如下:

  (1)首先執(zhí)行上下文表達式,生成一個上下文管理器對象;

  (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,則忽略異常,不再對異常進行處理。

分享到:
在線咨詢 我要報名
和我們在線交談!