python中的with用法

with是從Python2.5引入的一個新的語法,它是一種上下文管理協議,目的在於從流程圖中把 try,except 和finally 關鍵字和express

資源分配釋放相關代碼通通去掉,簡化try….except….finlally的處理流程。線程

with經過__enter__方法初始化,而後在__exit__中作善後以及處理異常。對象

因此使用with處理的對象必須有__enter__()和__exit__()這兩個方法。blog

其中__enter__()方法在語句體(with語句包裹起來的代碼塊)執行以前進入運行,__exit__()方法在語句體執行完畢退出後運行。utf-8

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

 

With語句的基本語法格式:get

with expression [as target]:it

with_bodyio

參數說明:class

expression:是一個須要執行的表達式;

target:是一個變量或者元組,存儲的是expression表達式執行返回的結果,可選參數。

例如:

>>> with open('d:\\xxx.txt') as fp:
...     print fp.read()
...
我沒法大是大非
我沒法大是大非
我沒法大是大非

 

with語句的工做原理:

緊跟with後面的語句會被求值,返回對象的__enter__()方法被調用,這個方法的返回值將被賦值給as關鍵字後面的變量,當with後面的代碼塊所有被執行完以後,將調用前面返回對象的__exit__()方法。

 with語句最關鍵的地方在於被求值對象必須有__enter__()和__exit__()這兩個方法,那咱們就能夠經過本身實現這兩方法來自定義with語句處理異常。

示例代碼:

#encoding=utf-8

class opened(object):
    def __init__(self,filename):
        self.handle=open(filename)
        print "Resource:%s"%filename
    def __enter__(self):
        print "[enter%s]: Allocate resource."%self.handle
        return self.handle#能夠返回不一樣的對象
    def __exit__(self,exc_type,exc_value,exc_trackback):
        print "[Exit %s]: Free resource." %self.handle
        if exc_trackback is None:
            print "[Exit %s]:Exited without exception."%self.handle
            self.handle.close()
        else:
            print "[Exit %s]: Exited with exception raised."%self.handle
        return False # 能夠省略,缺省的None也是被看作是False


with opened(r'd:\\xxx.txt') as fp:
    for line in fp.readlines():
        print line

結果:

 

opened中的__enter__() 返回的是自身的引用,這個引用能夠賦值給 as 子句中的fp變量;

返回值的類型能夠根據實際須要設置爲不一樣的類型,沒必要是上下文管理器對象自己。

__exit__() 方法中對變量exc_trackback進行檢測,若是不爲 None,表示發生了異常,返回 False 表示須要由外部代碼邏輯對異常進行處理;

若是沒有發生異常,缺省的返回值爲 None,在布爾環境中也是被看作 False,可是因爲沒有異常發生,__exit__() 的三個參數都爲 None,上下文管理代碼能夠檢測這種狀況,作正常處理。__exit__()方法的3個參數,分別表明異常的類型、值、以及堆棧信息。

相關文章
相關標籤/搜索