chapter15 上下文管理器和else塊

主要討論:

  • with 語(yǔ)句和上下文管理器
  • for、while 和try語(yǔ)句的else子句

if語(yǔ)句之外的else塊

else子句不僅能夠在if語(yǔ)句中使用,還能在for, while, try語(yǔ)句中使用.

  • for: 僅當(dāng)for循環(huán)運(yùn)行完畢時(shí)才執(zhí)行else塊.
  • while: 僅當(dāng)while循環(huán)因?yàn)闂l件為假值而退出時(shí)才運(yùn)行else塊.
  • try: 僅當(dāng)try塊中沒(méi)有異常拋出時(shí)才運(yùn)行else塊.

上下文管理器和with塊

上下文管理器協(xié)議包含__enter____exit__兩個(gè)方法.
with語(yǔ)句在開(kāi)始運(yùn)行時(shí),會(huì)在上下文管理器對(duì)象上調(diào)用__enter__方法,結(jié)束后會(huì)調(diào)用__exit__方法. 用__exit__方法扮演finally子句的角色.

contextlib模塊中的實(shí)用工具

  • closing:如果對(duì)象提供了close()方法,但沒(méi)有實(shí)現(xiàn)__enter__/__exit__協(xié)議??梢允褂眠@個(gè)函數(shù)構(gòu)造上下文管理器。
  • suppress:構(gòu)建臨時(shí)忽略指定異常的上下文管理器
  • @contextmanager: 這個(gè)裝飾器把簡(jiǎn)單的生成器函數(shù)變成了上下文管理器,這樣就不用創(chuàng)建類去實(shí)現(xiàn)管理器協(xié)議了。
  • ContextDecorator: 基類,用于定義基于類的上下文管理器。
  • ExitStack:這個(gè)上下文管理器能夠進(jìn)入多個(gè)上下文管理器。with塊結(jié)束時(shí),ExitStack按照后進(jìn)先出的順序調(diào)用棧中各個(gè)上下文管理器的__exit__方法。

使用@contextmanager

在使用該裝飾器的生成器中,yield語(yǔ)句的作用是把函數(shù)的定義體分為兩部分: yield語(yǔ)句前面的所有代碼在with塊開(kāi)始時(shí)執(zhí)行(__enter__方法),yield后面的代碼在with塊結(jié)束時(shí)運(yùn)行(__exit__方法).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容