python中with的實現原理
一般上,開啟檔案是
這個**塊預設開啟output.txt檔案,如果出現異常就會呼叫except;最終無論是否出現異常都會呼叫 finally 裡面的 f.close()**。def open_file1()
f = open("output.txt", "w")
try:
f.write("write successfully")
except exception as e:
print(e)
finally:
f.close()
這塊**可以實現的功能,和函式open_file1()實現的功能是一樣的;我們可以明顯的看出這塊**更為簡潔。def open_file2()
with open("output.txt", "w") as f:
f.write("write successfully")
任何實現了 __enter__和__exit__方法的物件都可以稱之為上下文管理器,上下文管理器物件可以使用with關鍵字。顯然,上述的函式open_file2()使用了上下文管理器。
open_file1(),open_file2(),open_file3()這三個函式,實現的功能是一樣的,其中open_file2()和open_file3()實現的原理是一樣的,在第三塊**中我們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")
python此外還提供了contextmanager這個裝飾器,進一步的簡化了上下文管理器的實現方式。通過yield將函式分割成兩部分,yield之前的語句是在__enter__方法中執行的,yield之後的語句在__exit__方法中執行,緊跟yield後面的值是__enter__方法返回的值。
python提供了with語法用於簡化資源操作的後續清楚操作,是try/finally的代替方法,實現原理建立在上下文管理器之上。此外,python還提供了乙個contextmanager裝飾器,更進一步簡化上下文管理器的實現方式。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語句了。想象下你有兩個需要結對執行的相關操作,然後還要在它們中間放置一段 上下文管理器就是專門讓你做這種事情的。舉個例子 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 ...