Python上下文管理器

2022-04-11 01:27:27 字數 2361 閱讀 7649

最近用到這個,仔細了解了一下,感覺是十分有用的,記錄一下

當我們需要獲取乙個臨時開啟的資源,並在使用完畢後進行資源釋放和異常處理,利用try-catch語句可以完成,舉個例子。

開啟檔案:

f = none

try:

print("try")

f = open("__init__.py", "r")

print(f.read())

except exception as e:

print("exception")

finally:

if f:

print("finally")

f.close()

利用上下文管理器:

class openhandle:

def __init__(self, filename, mode):

self.filename = filename

self.mode = mode

def __enter__(self):

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

return self.f

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

if exc_type:

print("exception")

else:

print("normal")

self.f.close()

with openhandle("book.txt", "r") as f:

print(f.read())

這樣可以利用with-as語句改寫**,讓程式設計師關注業務主流程,去掉對於資源的獲取和關閉這些重複操作。提公升**的可讀性。好處很大。

執行順序是理解這種寫法的關鍵:

初始化,執行handle的__init__()

__enter__()方法,獲取資源物件,返回給as後的變數

業務**邏輯

__exit__方法,傳入3個引數,異常型別,異常物件,呼叫棧物件,無異常都為none

丟擲異常或者正常結束

利用from contextlib import contextmanager這個裝飾器可以將函式裝飾為上下文管理器,其實這個裝飾背後也是返回乙個實現了__enter__和__exit__方法的類

from contextlib import contextmanager

@contextmanager

def managed_resource(*args, **kwds):

# code to acquire resource, e.g.:

resource = acquire_resource(*args, **kwds)

try:

yield resource

finally:

# code to release resource, e.g.:

release_resource(resource)

>>> with managed_resource(timeout=3600) as resource:

... # resource is released at the end of this block,

... # even if code in the block raises an exception

利用這個管理sqlalchemy會話物件的獲取和釋放,控制事務是再合適不過了

class dbtransaction:

def __init__(self, session_maker):

self.session_maker = session_maker

def __enter__(self):

self.session = self.session_maker()

# self.session.begin() #如果session_make()是auto_commit=true就要寫

return self.session

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

if exc_type:

self.session.rollback()

else:

self.session.commit()

self.session.close()

return false if exc_type else true

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