Python With 用法


背景

  有一些任務,可能事先需要設置,事后做清理工作。對於這種場景,Python的with語句提供了一種非常方便的處理方式。

with如何工作?

  • 緊跟with后面的語句被求值后,返回對象的 __enter__() 方法被調用,這個方法的返回值將被賦值給as后面的變量。
  • 當with后面的代碼塊全部被執行完之后,將調用前面返回對象的 __exit__()方法。

例子

  1. #!/usr/bin/env python
  2. class Test(obj):
  3.     def __enter__(self):
  4.         print "In __enter__()"
  5.               return "test_with"
  6.     def __exit__(self, type, value, trace):
  7.         print "In __exit__()"
  8. def get_example():
  9.     return Test()
  10. with get_example() as example:
  11.     print "example:", example

     大家可以做下實驗看下輸出.

      __exit__ 方法有三個參數 val, type 和 trace。 這些參數在異常處理中相當有用。

     實際上,在with后面的代碼塊拋出任何異常時,__exit__() 方法被執行。正如例子所示,異常拋出時,與之關聯的type,value和stack trace傳給 __exit__() 方法,因此拋出的XX異常被打印出來了。開發庫時,清理資源,關閉文件等等操作,都可以放在 __exit__ 方法當中。

     另外,__exit__ 除了用於tear things down,還可以進行異常的監控和處理,注意后幾個參數。要跳過一個異常,只需要返回該函數True即可。

     下面的樣例代碼跳過了所有的TypeError,而讓其他異常正常拋出。

    1. def __exit__(self, type, value, traceback):
    2.      return isinstance(value, TypeError)

      __exit__ 函數可以進行部分異常的處理,如果我們不在這個函數中處理異常,他會正常拋出,這時候我們可以這樣寫

  1. try:
  2.     with open( "a.txt" ) as f :
  3.         do something
  4. except xxxError:
  5.     do something about exception

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM