主要討論:
- 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)建類(lèi)去實(shí)現(xiàn)管理器協(xié)議了。
- ContextDecorator: 基類(lèi)挽霉,用于定義基于類(lèi)的上下文管理器防嗡。
- 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__
方法).