python中的with

with:python2.5之後引用,一種與異常處理相關的語句。

with語句適用於對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用後自動關閉、線程中鎖的自動獲取和釋放等。

用法:

with EXPR as VAR:
    BLOCK

實際運行過程:

  1. 執行EXPR,生成上下文管理器context_manager;
  2. 獲取上下文管理器的__exit()__方法,並保存起來用於之後的調用;
  3. 調用上下文管理器的__enter__()方法;如果使用了as子句,則將__enter__()方法的返回值賦值給as子句中的VAR;
  4. 執行BLOCK中的表達式;
  5. 不管是否執行過程中是否發生了異常,執行上下文管理器的__exit__()方法,__exit__()方法負責執行“清理”工作,如釋放資源等。如果執行過程中沒有出現異常,或者語句體中執行了語句break/continue/return,則以None作爲參數調用__exit__(None, None, None);如果執行過程中出現異常,則使用sys.exc_info得到的異常信息爲參數調用__exit__(exc_type, exc_value, exc_traceback)
  6. 出現異常時,如果__exit__(type, value, traceback)返回False,則會重新拋出異常,讓with之外的語句邏輯來處理異常,這也是通用做法;如果返回True,則忽略異常,不再對異常進行處理。

enter和exit方法可以自定義。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章