Python 上下文管理器

2021-08-19 08:06:05 字數 1820 閱讀 5067

python中的上下文管理器是乙個包裝任意**塊的物件。它在處理資源的開啟關閉、異常的處理等方面有很好的實現方法。

1. 上下文管理器的語法

假設我們需要讀取乙個檔案中的資料,**如下:

try:

test_file = open('test.txt', 'r')

contents = test_file.read()

finally:

test_file.close()

with open('test.txt', 'r') as test_file:

contents = test_file.read()

可以很明顯得看出,上下文管理器的優勢在於,它解決了檔案關閉的問題,我們在使用資源時,若資源在用完需要及時關閉時,我們就會用到上下文管理器。

2. 內部實現邏輯

上下文管理器的實現主要是和兩個方法有關:_enter_和_exit_。

本質上來講,with語句會對其後的**進行執行,該表示式會返回乙個物件,而這個物件包含的就是上面講的兩個方法:_enter_和_exit_。

2.1 _enter_方法

_enter_方法不接受任何引數,with後的**執行,返回物件時,該方法立即執行,如果有as變數(as子句為可選),方法的返回值會被賦給as後面的變數,一般來說,_enter_方法負責執行一些配置。

2.2 _exit_方法

_exit_方法帶有3個位置引數(不包括self),乙個異常型別exc_type,乙個異常例項exc_val,乙個回溯exc_tb。如果沒有異常,這3個引數全被設定成none,如果有異常發生,則填充引數。

如果_exit_接收乙個異常,就有處理這個異常的義務。如何處理這個異常,_exit_方法根據返回值有3個可選項:

• 傳播異常:返回false

• 終止異常:返回true

• 丟擲不同的異常:返回乙個不同的異常

3. 編寫上下文管理器

我們若要自行編寫乙個上下文管理器,則必須實現_enter_和_exit_方法,如下:

class base_cm:

def __init__(self):

self.state = false

def __enter__(self):

self.state = true

return self

def __exit__(self, exc_type, exc_val, exc_tb):

self.state = false

這是乙個簡單的上下文管理器,功能只是在進入時將state屬性設為true,注意,_enter_方法必須返回乙個物件,可以是自身,也可以是其他的物件。我們來使用這個上下文管理器看看:

cm = base_cm()

print(cm.state)

with cm:

print(cm.state)

print(cm.state)

輸出:false

true

false

4. 簡潔寫法

使用contextlib模組中的contextmanager函式,我們可以有更簡潔的上下文管理器寫法:

from contextlib import contextmanager

@contextmanager

def context_manager(*args):

try:

yield

except baseexception as e:

pass

python 上下文管理器

上下文管理器允許你在有需要的時候,精確地分配和釋放資源。使用上下文管理器最廣泛的案例就是with語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 with open some file w as opened file open...

python上下文管理器

上下文管理器是乙個包裝任意 塊的物件。上下文管理器保證進入上下文管理器時,每次 執行的一致性 當退出上下文管理器時,相關資源會被正確 這裡被正確 指的是在 exit 方法自定義 比如關閉資料庫游標 值得注意的是,上下文管理器一定能夠保證退出步驟的執行。如果進入上下文管理器,根據定義,一定會有退出步驟...

python上下文管理器

上下文管理器可以通過使用更可讀 更精簡的 實現資源的分配與釋放 對於上下文管理器的使用,最常見的是使用with語句,with語句可構建資源的分配與釋放的語法糖。先拿最常見的例子來說,即檔案的開啟與關閉。正常語法 f file filename,w try f.write test file fina...