本文實例講述了Python中with及contextlib的用法。分享給大家供大家參考,具體如下:
平常Coding過程中,經(jīng)常使用到的with場景是(打開文件進行文件處理,然后隱式地執(zhí)行了文件句柄的關(guān)閉,同樣適合socket之類的,這些類都提供了對with的支持):
with file('test.py','r') as f : print f.readline()with的作用,類似try...finally...,提供一種上下文機制,要應(yīng)用with語句的類,其內(nèi)部必須提供兩個內(nèi)置函數(shù)__enter__以及__exit__。前者在主體代碼執(zhí)行前執(zhí)行,后則在主體代碼執(zhí)行后執(zhí)行。as后面的變量,是在__enter__函數(shù)中返回的。通過下面這個代碼片段以及注釋說明,可以清晰明白__enter__與__exit__的用法:
#!encoding:utf-8class echo : def output(self) : print 'hello world' def __enter__(self): print 'enter' return self #返回自身實例,當(dāng)然也可以返回任何希望返回的東西 def __exit__(self, exception_type, exception_value, exception_traceback): #若發(fā)生異常,會在這里捕捉到,可以進行異常處理 print 'exit' #如果改__exit__可以處理改異常則通過返回True告知該異常不必傳播,否則返回False if exception_type == ValueError : return True else: return Falsewith echo() as e: e.output() print 'do something inside'print '-----------'with echo() as e: raise ValueError('value error')print '-----------'with echo() as e: raise Exception('can not detect')運行結(jié)果:

contextlib是為了加強with語句,提供上下文機制的模塊,它是通過Generator實現(xiàn)的。通過定義類以及寫__enter__和__exit__來進行上下文管理雖然不難,但是很繁瑣。contextlib中的contextmanager作為裝飾器來提供一種針對函數(shù)級別的上下文管理機制。常用框架如下:
from contextlib import contextmanager@contextmanagerdef make_context() : print 'enter' try : yield {} except RuntimeError, err : print 'error' , err finally : print 'exit'with make_context() as value : print valuecontextlib還有連個重要的東西,一個是nested,一個是closing,前者用于創(chuàng)建嵌套的上下文,后則用于幫你執(zhí)行定義好的close函數(shù)。但是nested已經(jīng)過時了,因為with已經(jīng)可以通過多個上下文的直接嵌套了。下面是一個例子:
from contextlib import contextmanagerfrom contextlib import nestedfrom contextlib import closing@contextmanagerdef make_context(name) : print 'enter', name yield name print 'exit', namewith nested(make_context('A'), make_context('B')) as (a, b) : print a print bwith make_context('A') as a, make_context('B') as b : print a print bclass Door(object) : def open(self) : print 'Door is opened' def close(self) : print 'Door is closed'with closing(Door()) as door : door.open()運行結(jié)果:

總結(jié):python有很多強大的特性,由于我們平常總習(xí)慣于之前C++或java的一些編程習(xí)慣,時常忽略這些好的機制。因此,要學(xué)會使用這些python特性,讓我們寫的python程序更像是python。
希望本文所述對大家Python程序設(shè)計有所幫助。
新聞熱點
疑難解答
圖片精選