with:python2.5之後引用,一種與異常處理相關的語句。
with
語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用後自動關閉、線程中鎖的自動獲取和釋放等。
用法:
with EXPR as VAR:
BLOCK
實際運行過程:
- 執行EXPR,生成上下文管理器context_manager;
- 獲取上下文管理器的
__exit()__
方法,並保存起來用於之後的調用; - 調用上下文管理器的
__enter__()
方法;如果使用了as
子句,則將__enter__()
方法的返回值賦值給as
子句中的VAR; - 執行BLOCK中的表達式;
- 不管是否執行過程中是否發生了異常,執行上下文管理器的
__exit__()
方法,__exit__()
方法負責執行“清理”工作,如釋放資源等。如果執行過程中沒有出現異常,或者語句體中執行了語句break/continue/return
,則以None
作爲參數調用__exit__(None, None, None)
;如果執行過程中出現異常,則使用sys.exc_info
得到的異常信息爲參數調用__exit__(exc_type, exc_value, exc_traceback)
; - 出現異常時,如果
__exit__(type, value, traceback)
返回False,則會重新拋出異常,讓with
之外的語句邏輯來處理異常,這也是通用做法;如果返回True,則忽略異常,不再對異常進行處理。
enter和exit方法可以自定義。