Python上下文管理器with深入講解

2021-10-17 08:52:44 字數 1411 閱讀 2435

python程式設計時用到with上下文管理器的地方很多,但大多數人只知道怎麼用卻沒有深入了解它。在此我嘗試對python上下文管理器with進行深入講解,希望能幫到大家更好和更深入地掌握with的用法。

with語句是上下文管理器,上下文管理器(是乙個物件)定義了在進入和退出with語句時需要執行上下文**塊。完整的上下文管理器必須有以下兩個方法:

object.__enter__(self)

進入with語句塊時會自動執行該物件的__enter__方法,如果有as子句那麼with語句將將此方法的返回值繫結到as指定的目標。

object.__exit__(self, exc_type, exc_value, traceback)

退出with語句塊時會自動執行此物件的__exit__方法,三個引數分別描述了導致上下文退出的異常。 如果上下文是無異常地退出的那麼這三個引數都將為none。如果希望遇到異常時不拋異常那麼需要return true;否則會正常流程處理。

注意:python直譯器會保證執行with語句時只要__enter__方法未報錯那麼__exit__方法總是會被呼叫。

在很多具有開啟和關閉動作的場景都可以用with語句,常見的應用場景有開啟和關閉檔案、執行緒池、程序池、socket等等。

以下是使用with和不使用with的**對比:

通過對比我們可以發現使用with可以讓**簡潔優雅!

with語句可以巢狀使用,也可以單句復用。下面列舉乙個讀寫檔案的案例。

讀取a.txt檔案的內容,將其追加到b.txt檔案中:

巢狀使用with:

with

open

('a.txt'

, mode=

'rt'

)as r:

with

open

('b.txt'

, mode=

'a+'

)as w:

result =

'\n'

+r.read(

) w.write(result)

單句使用with:

with

open

('a.txt'

, mode=

'rt'

)as r,

open

('b.txt'

, mode=

'a+'

)as w:

result =

'\n'

+r.read(

) w.write(result)

兩種用法結果完全一致,我更推薦第二種用法,**更加簡潔優雅。

下面寫了乙個自定義的openfile類,用來演示with自定義上下文管理器的方法。望能起到拋磚引玉的效果,讓大家學會with上下文管理器的自定義方法。

python 上下文管理器

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

python上下文管理器

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

Python 上下文管理器

python中的上下文管理器是乙個包裝任意 塊的物件。它在處理資源的開啟關閉 異常的處理等方面有很好的實現方法。1.上下文管理器的語法 假設我們需要讀取乙個檔案中的資料,如下 try test file open test.txt r contents test file.read finally ...