您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中上下文管理器的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Python上下文管理器
簡介
最近用到這個,仔細了解了一下,感覺是十分有用的,記錄一下
使用場景
當我們需要獲取一個臨時打開的資源,并在使用完畢后進行資源釋放和異常處理,利用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會話上下文管理器
利用這個管理sqlalchemy會話對象的獲取和釋放,控制事務是再合適不過了
class DbTransaction: def __init__(self, session_maker): self.session_maker = session_maker def __enter__(self): self.session = self.session_maker() 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中上下文管理器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。