本篇文章為大家展示了python上下文管理器的深度剖析,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出淮安區(qū)免費(fèi)做網(wǎng)站回饋大家。
基本概念
·上下文管理協(xié)議(Context Management Protocol)
包含方法__enter__ 和 __exit__,支持該協(xié)議的對象要實現(xiàn)這兩個方法。
·上下文管理器( Content Manager )
支持上下文管理協(xié)議的對象,實現(xiàn)了__enter__ / __exit__方法。上下文管理器定義執(zhí)行with語句時要建立的運(yùn)行時上下文,負(fù)責(zé)執(zhí)行with語句塊上下文的進(jìn)入和退出操作。通常使用with語句調(diào)用上下文管理器。
·運(yùn)行時上下文( runtime context )
由上下文管理器創(chuàng)建,通過上下文管理器的__enter和__exit__方法實現(xiàn),__enter方法在語句體執(zhí)行之前進(jìn)入運(yùn)行時上下文,__exit__在語句題執(zhí)行完成后從上下文運(yùn)行時退出。
·上下文表達(dá)式(Context Expression)
with 語句中跟在關(guān)鍵字with之后的表達(dá)式,該表達(dá)式返回一個上下文管理器對象。
·語句體(with-body)
with語句包裹起來的代碼塊,在執(zhí)行語句體之前調(diào)用上下文管理器的__enter__方法,執(zhí)行完語句體之后會執(zhí)行__exit__方法。
with不是上下文管理器。with只是一個語句。實現(xiàn)了__enter__和__exit__這兩個上下文管理協(xié)議方法的對象,都被稱作上下文管理器。 上下文管理器被with調(diào)用時,會創(chuàng)建運(yùn)行時上下文,__enter__在語句體執(zhí)行之前進(jìn)入運(yùn)行時上下文,__exit__負(fù)責(zé)在語句執(zhí)行完成 之后退出。
with
with語句用上下文管理器定義的方法包裹一段代碼的執(zhí)行,等價于try...except..finally。with的主要作用是相當(dāng)于finally。
一、多個上下文管理器
with A() as a,B() as b: suite
二、上下文管理器類型
context manager 是Python中with語句用來定義運(yùn)行時上下文的對象,上下文管理器控制著進(jìn)/出運(yùn)行時上下文的功能,上下文管理器通常由with語句出發(fā),也可以直接通過他們的方法來調(diào)用它們。上下文管理器通常用于保存和恢復(fù)各式各樣的全局狀態(tài)、加解鎖資源和關(guān)閉文件的文件等。
自定義上下文管理器
class TraceBlock: def message(self, arg): print('running ' + arg) def __enter__(self): print('starting with block') return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: print('exited normally') else: print('raise an exception' + str(exc_type)) return False if __name__ == '__main__': with TraceBlock() as action: action.message('test1') raise Exception print('reached')
上下文裝飾器
因為自定義裝飾器比較麻煩,用contextlib.contextmanager將生成器轉(zhuǎn)化為上下文管理器,不必創(chuàng)建一個類或單獨指定__enter__和__exit__方法。
@contextmanager def message(arg): print('running' + arg) yield print('hello') if __name__ == '__main__': with message('hell'): print('ok')
裝飾器,用來裝飾一個生成器函數(shù),使這個生成器函數(shù)稱為一個上下文管理器。
包含yield的函數(shù)才是生成器函數(shù),即contextmanager裝飾的函數(shù)必須含有yield!
@contextmanager def make_context(): print('enter') try: yield {} except Exception as err: print('error', err) finally: print('exit') if __name__ == '__main__': with make_context() as value: raise Exception print(value)
生成器函數(shù)中yield之前的語句在__enter__方法中執(zhí)行;yield之后的語句在__exit__中執(zhí)行;yield產(chǎn)生的值賦值給as子句中的variable變量。如果有異常產(chǎn)生,在上面的例子中,能夠被except捕獲。
上述內(nèi)容就是python上下文管理器的深度剖析,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。