原文地址?
with語句是一種與異常處理相關(guān)的功能。with語句適用于對(duì)資源進(jìn)行訪問的場(chǎng)合,確保不管使用過程中是否發(fā)生異常都會(huì)執(zhí)行必要的"清理"操作,釋放資源。比如文件使用后自動(dòng)關(guān)閉,線程中鎖的自動(dòng)獲取和釋放。
有了上下文管理器,with語句才能工作。下面是一組與上下文管理器和with語句有關(guān)的概念。
上下文管理協(xié)議(Context Management Protocol): 包含方法__enter__() 和__exit__(), 支持該協(xié)議的對(duì)象要實(shí)現(xiàn)這兩個(gè)方法。
上下文管理器(Context Manager): 支持上下文管理協(xié)議的對(duì)象,這種對(duì)象的實(shí)現(xiàn)了__enter__()和__exit__()方法。上下文管理器定義執(zhí)行with語句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with語句塊上下文中的進(jìn)入與退出的操作。通常使用with語句調(diào)用上下文管理器,也可以通過直接調(diào)用其方法來使用。
運(yùn)行時(shí)上下文(runtime context):有上下文管理器創(chuàng)建,通過上下文管理器的__enter__()和__exit__()方法實(shí)現(xiàn),__enter__()方法在語句執(zhí)行之前進(jìn)入運(yùn)行時(shí)上下文,__exit__()在語句體執(zhí)行完和哦從上下文退出,with語句支持運(yùn)行時(shí)上下文這一概念。
上下文表達(dá)式(Context Expression):with語句中跟在關(guān)鍵字with之后的表達(dá)式,該表達(dá)式要返回一個(gè)上下文管理器對(duì)象。
語句體(with-body):with語句包裹起來的代碼塊,在執(zhí)行語句體之前會(huì)調(diào)用上下文管理器的__enter__()方法,執(zhí)行完語句體之后會(huì)執(zhí)行__exit__()方法。
with 語句的語法格式
with context_expression [as target(s)]:
??????? with-body
context_expression 要返回一個(gè)上下文管理器對(duì)象。該對(duì)象并不賦值給as字句中的target(s),如果指定了as字句的話,會(huì)將上下文管理器的__enter__()方法的返回值賦值給target(s).target(s)可以是單個(gè)變量,或者由"()"括起來的元組.
eg:
with open(r'somefileName') as somefile:
??????? for line in somefile:
??????? print line
??????? # ...more code
這里使用了with語句,不管在處理文件過程中是否發(fā)生異常,都會(huì)保證with語句執(zhí)行完畢后已經(jīng)關(guān)閉了打開的文件句柄。
對(duì)應(yīng)的傳統(tǒng)的try/finally范式,則要使用類似如下代碼:
somefile = open(r"sonmefileName")
try:
?????? for line in somefile:
?????? print line
?????? # ... more code
finally:
?????? somefile.close()