python上下文管理器 with

2021-09-16 21:02:26 字數 1977 閱讀 1234

python中with的實現原理

一般上,開啟檔案是

def open_file1()

f = open("output.txt", "w")

try:

f.write("write successfully")

except exception as e:

print(e)

finally:

f.close()

這個**塊預設開啟output.txt檔案,如果出現異常就會呼叫except;最終無論是否出現異常都會呼叫 finally 裡面的 f.close()**。

def open_file2()

with open("output.txt", "w") as f:

f.write("write successfully")

這塊**可以實現的功能,和函式open_file1()實現的功能是一樣的;我們可以明顯的看出這塊**更為簡潔。

任何實現了 __enter__和__exit__方法的物件都可以稱之為上下文管理器,上下文管理器物件可以使用with關鍵字。顯然,上述的函式open_file2()使用了上下文管理器。

class defined_open_file():

def __init__(self, filename, mode):

self.filename = filename

self.mode = mode

def __enter__(self):

print("開啟檔案")

self.file = open(self.filename, self.mode)

return self.file;

def __exit__(self, *args):

print("關閉檔案")

self.file.close();

def open_file3():

with defined_open_file("output.txt", "w") as f:

f.write("write successfully")

open_file1(),open_file2(),open_file3()這三個函式,實現的功能是一樣的,其中open_file2()和open_file3()實現的原理是一樣的,在第三塊**中我們

python此外還提供了contextmanager這個裝飾器,進一步的簡化了上下文管理器的實現方式。通過yield將函式分割成兩部分,yield之前的語句是在__enter__方法中執行的,yield之後的語句在__exit__方法中執行,緊跟yield後面的值是__enter__方法返回的值。

from contextlib import contextmanager

@contextmanager

def file_open(path, mode):

f = open(path, mode)

yield f

f.close()

# 呼叫

with file_open("output.txt", "w") as f:

# 此時呼叫關鍵字yield之前的**,並將yield關鍵字之後的引數賦予as關鍵字之後的引數

f.write("write successfully")

# 在with結束或出現異常的時候,再呼叫yield之後的**

python提供了with語法用於簡化資源操作的後續清楚操作,是try/finally的代替方法,實現原理建立在上下文管理器之上。此外,python還提供了乙個contextmanager裝飾器,更進一步簡化上下文管理器的實現方式。

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 ...