python上下文管理之基於生成器的實現

2021-08-21 22:19:34 字數 947 閱讀 1154

我們還可以用裝飾器(decorators)和生成器(generators)來實現上下文管理器。

python有個contextlib模組專門用於這個目的。我們可以使用乙個生成器函式來實現乙個上下文管理器,而不是使用乙個類。

讓我們看看乙個基本的,沒用的例子:

from contextlib import contextmanager

@contextmanager

def open_file(name):

f = open(name, 'w')

yield f

f.close()

ok啦!這個實現方式看起來更加直觀和簡單。然而,這個方法需要關於生成器、yield和裝飾器的一些知識。在這個例子中我們還沒有捕捉可能產生的任何異常。它的工作方式和之前的方法大致相同。

讓我們小小地剖析下這個方法。 1. python直譯器遇到了yield關鍵字。因為這個緣故它建立了乙個生成器而不是乙個普通的函式。 2. 因為這個裝飾器,contextmanager會被呼叫並傳入函式名(open_file)作為引數。 3.contextmanager函式返回乙個以generatorcontextmanager物件封裝過的生成器。 4. 這個generatorcontextmanager被賦值給open_file函式,我們實際上是在呼叫generatorcontextmanager物件。

那現在我們既然知道了所有這些,我們可以用這個新生成的上下文管理器了,像這樣:

with open_file('some_file') as f:

f.write('hola!')

python之with上下文管理

finally塊由於是否發生異常都會執行,通常是釋放資源的 可以通過with上下文管理,更方便的實現釋放資源的操作。with上下文管理的語法結構 with context expr as var 語句塊with上下文管理可以自動管理資源,在with 塊執行完後自動還原進入 之前的現場或上下文。cod...

python上下文管理

重寫 enter 方法,返回值會被 as 捕獲 重寫 exit 方法 democlass mycontextmanager def enter self print 進入管理器範圍執行方法 此處的返回值會被 with xx as 捕獲 return 退出上下文管理範圍執行方法,即使中間報錯也會執行 ...

python 高階 with 上下文管理

with 上下文管理器 語法糖 python 提供的一種簡化語法,在編寫 時更加簡潔 with 就是眾多語法糖中的一種 with 執行原理 能通過with進行執行的語句,都是實現了上下文管理器 上下文管理器中包含兩個魔法方法 enter 和 exit enter 方法提供環境的初始化操作 exit ...