摘要:上下文管理器和塊上下文管理器協(xié)議包含和兩個方法。語句運行結(jié)束后,會在上下文管理器對象上調(diào)用方法,以此扮演子句的角色。
上下文管理器
最終,上下文管理器可能幾乎與子程序(subroutine)本身一樣重要。
在各種語言中 with 語句的作用不同,而且做的都是簡單的事,雖然可以避免不
斷使用點號查找屬性,但是不會做事前準(zhǔn)備和事后清理。
else太個性了, 其他語言不同用 不用這個
兩個風(fēng)格 EAFP 這種就得看好哪個else語句了 取得原諒比獲得許可容易(easier to ask for forgiveness than permission)。這是一
種常見的 Python 編程風(fēng)格,先假定存在有效的鍵或?qū)傩?,如果假定不成立,那么?br>獲異常。這種風(fēng)格簡單明快,特點是代碼中有很多 try 和 except 語句。與其他很多
語言一樣(如 C 語言),這種風(fēng)格的對立面是 LBYL 風(fēng)格。
接下來,詞匯表定義了 LBYL。
三思而后行(look before you leap)。這種編程風(fēng)格在調(diào)用函數(shù)或查找屬性或鍵
之前顯式測試前提條件。與 EAFP 風(fēng)格相反,這種風(fēng)格的特點是代碼中有很多 if 語
句。在多線程環(huán)境中,LBYL 風(fēng)格可能會在“檢查”和“行事”的空當(dāng)引入條件競爭。例
如,對 if key in mapping: return mapping[key] 這段代碼來說,如果在測試
之后,但在查找之前,另一個線程從映射中刪除了那個鍵,那么這段代碼就會失敗。
這個問題可以使用鎖或者 EAFP 風(fēng)格解決。
上下文管理器協(xié)議包含 enter 和 exit 兩個方法。with 語句開始運行時,會在上下文管理器對象上調(diào)用 enter 方法。
with 語句運行結(jié)束后,會在上下文管理器對象上調(diào)用 exit 方法,以此扮演 finally 子句的角色。
class LookingGlass: def __enter__(self): import sys self.original_write = sys.stdout.write sys.stdout.write = self.reverse_write return "JABBERWOCKY" def reverse_write(self, text): self.original_write(text[::-1]) def __exit__(self, exc_type, exc_value, traceback): import sys sys.stdout.write = self.original_write if exc_type is ZeroDivisionError: print("Please DO NOT divide by zero!") return True
? 如果一切正常,Python 調(diào)用 exit 方法時傳入的參數(shù)是 None, None, None;如
果拋出了異常,這三個參數(shù)是異常數(shù)據(jù),如下所述。
解釋器調(diào)用 enter 方法時,除了隱式的 self 之外,不會傳入任何參數(shù)。傳給
exit 方法的三個參數(shù)列舉如下。
exc_type
異常類(例如 ZeroDivisionError)。
exc_value
異常實例。有時會有參數(shù)傳給異常構(gòu)造方法,例如錯誤消息,這些參數(shù)可以使用exc_value.args 獲取。
traceback
traceback 對象。
能減少創(chuàng)建上下文管理器的樣板代碼量,因為不用編寫一個完整的類,定義 enter 和 exit 方法,
而只需實現(xiàn)有一個 yield 語句的生成器,生成想讓 enter 方法返回的值。
總結(jié)def __enter__(self): 一般返回 self自己
def __exit__(self, exc_type, exc_value, traceback):
exc_type
異常類(例如 ZeroDivisionError)。exc_value
異常實例。有時會有參數(shù)傳給異常構(gòu)造方法,例如錯誤消息,這些參數(shù)可以使用exc_value.args 獲取。traceback
traceback 對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42065.html
摘要:上下文管理器協(xié)議包含和兩個方法。因此必要時在上下文管理器函數(shù)中使用語句防范錯誤。構(gòu)建臨時忽略指定異常的上下文管理器。這是個基類,用于定義基于類的上下文管理器。塊結(jié)束時,按照后進先出的順序調(diào)用棧中各個上下文管理器的方法。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點: 1、掌握if語句之外的el...
摘要:導(dǎo)語本文章匯總了本人在學(xué)習(xí)基礎(chǔ)之緒論篇數(shù)據(jù)結(jié)構(gòu)篇函數(shù)篇面向?qū)ο笃刂屏鞒唐驮幊唐獙W(xué)習(xí)筆記的鏈接,打算入門的朋友們可以按需查看并交流。 導(dǎo)語:本文章匯總了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇、數(shù)據(jù)結(jié)構(gòu)篇、函數(shù)篇、面向?qū)ο笃?、控制流程篇和元編程篇學(xué)習(xí)筆記的鏈接,打算入門Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數(shù)據(jù)模型 第二部分:數(shù)據(jù)結(jié)構(gòu)篇 2、序列構(gòu)成...
摘要:一個典型的上下文管理器類如下處理異常正如方法名明確告訴我們的,方法負(fù)責(zé)進入上下的準(zhǔn)備工作,如果有需要可以返回一個值,這個值將會被賦值給中的??偨Y(jié)都是關(guān)于上下文管理器的內(nèi)容,與協(xié)程關(guān)系不大。 Part 1 傳送門 David Beazley 的博客 PPT 下載地址 在 Part 1 我們已經(jīng)介紹了生成器的定義和生成器的操作,現(xiàn)在讓我們開始使用生成器。Part 2 主要描述了如...
摘要:只有當(dāng)父加載器無法完成加載的時候,子加載器才會嘗試自己加載。破壞雙親委托機制實現(xiàn)熱部署 類加載器: 負(fù)責(zé)將生成的.class文件加載到內(nèi)存中,并生成對應(yīng)的Class對象 三種類加載器: BootStrapClassLoader:引導(dǎo)類加載器,負(fù)責(zé)java核心類的加載 ExtensionClassLoader: 擴展類加載器 AppClassLoader:應(yīng)用類加...
閱讀 1860·2021-09-23 11:21
閱讀 707·2019-08-30 15:55
閱讀 844·2019-08-29 15:40
閱讀 541·2019-08-29 12:56
閱讀 3175·2019-08-26 12:00
閱讀 3567·2019-08-23 18:24
閱讀 2259·2019-08-23 17:08
閱讀 1649·2019-08-23 17:03