您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關python中@contextmanager的使用示例的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在對于python中的裝飾器,我們一般會使用它輔助方法。在我們學習的上下文管理器中,有一個@contextmanager裝飾器,它能夠幫助我們在函數中定義上下文管理器方法,實現代碼方面的簡化。下面我們就python中@contextmanager的概念、使用注意、實例進行分享。
是contextlib模塊提供的一個裝飾器,用于將一個函數聲明上下文管理,無需創建一個類或者單獨的__enter__()方法和__exit__()方法,就可以實現上下文管理。
裝飾器@contextmanager真正的用法并不是簡化上下文管理器,而是去定義上下文管理器的方法,是對原來不是上下文管理器的類變成了一個上下文管理器。
from contextlib import contextmanager import time @contextmanager def demo(label): start = time.time() try: yield finally: end = time.time() print('{}: {}'.format(label, end - start)) with demo('counting'): n = 10000000 while n > 0: n -= 1 # counting: 1.32399988174
看上面這個例子,函數中yield之前的所有代碼都類似于上下文管理器中__enter__方法的內容。而yield之后的所有代碼都如__exit__方法的內容。如果執行過程中發生了異常,則會在yield語句觸發。
實例擴展:
實例一:
from contextlib import contextmanager class File(): def query(self): print('查詢文件') @contextmanager def open(): print('打開文件') yield File() print('關閉文件') with open() as f: f.query() # 結果 打開文件 查詢文件 關閉文件
實例二:
from contextlib import contextmanager class DataBase(): def query(self): print('寫入操作') @contextmanager def open(self): try: yield self.commit() except Exception as e: self.rollback() raise e db = DataBase() with db.open(): db.query()
感謝各位的閱讀!關于“python中@contextmanager的使用示例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。