標準庫中還有個contextlib 模組,提供一些實用工具,
下面展開介紹下@contextmanager
@contextmanager 裝飾器能減少建立上下文管理器的樣板**量,因為不用編寫乙個完整的類,定義 __enter__ 和 __exit__ 方法,而只 需實現有乙個 yield 語句的生成器,生成想讓__enter__ 方法返回的值。yield 語句的作用是把函式的定義體分成兩部分:yield語句前面的所有**在 with塊開始時(即直譯器呼叫 __enter__ 方法時)執行,yield語句後面的**在with塊結束時(即呼叫__exit__方法時)執行。
>>> @contextmanager
... def lookingglass():
... import sys
... origin_writer=sys.stdout.write
... def reverse_writer(text):
... origin_writer(text[::-1])
... sys.stdout.write=reverse_writer
... try:
... yield 'yield return'
... except:
... print('enter exception')
... finally:
... sys.stdout.write=origin_writer
...
>>> with lookingglass() as what:
... print('test code')
... print(what)
...
edoc tset
nruter dleiy
>>> print('test')
test
生成器函式的作用更像是協程:執行到某一點時暫停,讓客戶**執行,直到客戶讓協程繼續做事
python 上下文管理器和with塊一
with和python上下文管理器
下面是3種開啟資源的方式,一種直接開啟,一種try方式,一種with方式,每個的方式的優缺點就不說了,這裡記錄下with先骨幹的內容。f open a.txt r do thing f.close try f open a.txt r do thing except ioerror as e pri...
python 上下文管理器
上下文管理器允許你在有需要的時候,精確地分配和釋放資源。使用上下文管理器最廣泛的案例就是with語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 with open some file w as opened file open...
python上下文管理器
上下文管理器是乙個包裝任意 塊的物件。上下文管理器保證進入上下文管理器時,每次 執行的一致性 當退出上下文管理器時,相關資源會被正確 這裡被正確 指的是在 exit 方法自定義 比如關閉資料庫游標 值得注意的是,上下文管理器一定能夠保證退出步驟的執行。如果進入上下文管理器,根據定義,一定會有退出步驟...