python中的with上下文管理器
with 語句
with 語句是 Pyhton 提供的一種簡化語法,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源。
在沒有學習with的句法之前,通常我們都是使用try…finally語句,即使是在出現錯誤的情況下 也能運行某些清理代碼。而今天學習的with語句就是對這些代碼功能的一些簡單封裝。
with語句通常會使用在如下的幾個環境之中:
- 打開關閉一個文件
- 釋放一個鎖
- 創建一個臨時的代碼補丁
- 在特殊環境下運行受保護的代碼
那么,接下來我們就舉打開關閉文件的例子說明:
我們先使用file()方法,看看兩者之間有什么不同?
上面的代碼,我們是要打開位于/etc目錄的hosts文件,使用file()方法之后,又手動調用close()關閉文件。
那么,使用with語句之后,我們可以重寫為:
with的執行過程:
在執行 with 語句時,首先執行 with 后面的 open 代碼
執行完代碼后,會將代碼的結果通過 as 保存到 hosts 中
然后在下面實現真正要執行的操作
在操作后面,并不需要寫文件的關閉操作,文件會在使用完后自動關閉
上下文管理器
任何實現了 _enter_(self) 和 _exit_(self,exc_type,exc_value,traceback) 方法的對象都可稱之為上下文管理器,上下文管理器對象可以使用 with 關鍵字。顯然,文件(file)對象也實現了上下文管理器協議。
從底層原理的角度來說,with語句的執行過程如下:
我們可以模擬實現一個自己的文件類,讓該類實現 _enter_() 和 _exit_() 方法。
class File():def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):print("entering")self.f = open(self.filename, self.mode)return self.fdef __exit__(self, *args):print("will exit")self.f.close()注:當我們打開文件時,就會自動調用_enter_,最終會返回該資源對象。當退出文件時,會自動調用__exit_方法,把文件關閉,做一些清理工作。
因為 File 類實現了上下文管理器,現在就可以使用 with 語句了。
with File('out.txt', 'w') as f:print("writing")f.write('哈哈哈,你好啊!')contextlib模塊
contextlib模塊是實現上下文管理的另外一種方式,這個模塊提供了與上下文管理器一起使用的輔助函數。它使用的是 contextmanager 裝飾器,通過 yield 將函數分割成兩部分,yield 之前的語句在\ enter 方法中執行,yield 之后的語句在 _exit_ 方法中執行。緊跟在 yield 后面的值是函數的返回值。
from contextlib import contextmanager@contextmanager def my_open(path, mode):f = open(path, mode)yield ff.close()使用:
with my_open('out.txt', 'w') as f:f.write("hello , the simplest context manager")參考文獻:
【Python】with及上下文管理器的原理和應用
Pythong高級編程(第二版)
總結
以上是生活随笔為你收集整理的python中的with上下文管理器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的魔法属性和方法
- 下一篇: Mysql数据库中的as和distinc