python 上下文管理器、 else 块、@contextmanager
生活随笔
收集整理的這篇文章主要介紹了
python 上下文管理器、 else 块、@contextmanager
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. else
- 2. with上下文管理器
- 3. contextlib模塊實用工具
- 4. @contextmanager 裝飾器
learn from 《流暢的python》
1. else
- for/else、while/else 和 try/else
前兩者 只有在 沒有被break 時,才會運行 else
try 塊中沒有異常拋出時 才運行 else
else 這么用的比較少
2. with上下文管理器
上下文管理器協(xié)議包含 __enter__ 和 __exit__ 兩個方法
- with 語句 運行時,會在上下文管理器對象上調(diào)用 __enter__ 方法
- with 語句 結(jié)束后,會在上下文管理器對象上調(diào)用 __exit__ 方法,以此扮 演 finally 子句的角色(釋放重要的資源,或者 還原臨時變更的狀態(tài)),如 關(guān)閉文件等
3. contextlib模塊實用工具
- closing 如果對象 提供了 close() 方法,但沒有實現(xiàn) __enter__/__exit__ 協(xié)議,那么可以使用這個函數(shù)構(gòu)建上下文管理器
- suppress, 構(gòu)建臨時 忽略指定異常 的上下文管理器
- @contextmanager,裝飾器 把簡單的 生成器函數(shù) 變成 上下文管理器,這樣就不用創(chuàng)建類去實現(xiàn)管理器協(xié)議了
- ContextDecorator,這是個基類,用于定義基于類的上下文管理器。這種上下文管理器 也能用于 裝飾函數(shù),在受管理的上下文中運行整個函數(shù)
- ExitStack,這個上下文管理器 能進入多個 上下文管理器。with 塊結(jié)束時,ExitStack 按照后進先出的順序調(diào)用棧中各個上下文管理器的 __exit__ 方法。
如果事先不知道 with 塊要進入 多少個上下文管理 器,可以使用這個類。例如,同時打開任意一個文件列表中的所有文件
使用最廣泛的是 @contextmanager 裝飾 器,因此要格外留心。
這個裝飾器也有迷惑人的一面,因為它與迭代 無關(guān),卻要 使用 yield 語句
4. @contextmanager 裝飾器
- @contextmanager 裝飾器能減少代碼量,因為 不用編寫一個完整的類,定義 __enter__ 和 __exit__ 方法,而 只需實現(xiàn) 有一個 yield 語句的生成器,生成想讓 __enter__ 方法返回的值
- 在使用 @contextmanager 裝飾的生成器中,yield 語句的作用是 把函數(shù)的定義體分成兩部分:
yield 語句前面的所有代碼在 with 塊開始時 (即解釋器調(diào)用 __enter__ 方法時)執(zhí)行
yield 語句后面的代碼在 with 塊結(jié)束時(即調(diào)用 __exit__ 方法時)執(zhí)行
其實,contextlib.contextmanager 裝飾器會把函數(shù)包裝成實現(xiàn) __enter__ 和 __exit__ 方法的類
用于原地重寫文件的上下文管理器
import csv with inplace(csvfilename, 'r', newline='') as (infh, outfh): reader = csv.reader(infh) writer = csv.writer(outfh) for row in reader: row += ['new', 'columns'] writer.writerow(row)inplace 函數(shù)是個上下文管理器,為同一個文件提供了兩個句柄(例中的 infh 和 outfh),以便同時讀寫同一個文件。比標(biāo)準(zhǔn)庫中的 fileinput.input 函數(shù) 易用
總結(jié)
以上是生活随笔為你收集整理的python 上下文管理器、 else 块、@contextmanager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1807. 替换字符串
- 下一篇: 流畅的Python 2. 数据结构 -