Python with 語句淺析
python的with 語句作爲 try/finally 編碼範式的一種替代,用於對資源訪問進行控制的場合,此文也是今晚看書產生的寫博心態,基於一個寫文件的小例子來擼一下with語句,能擼多遠擼多遠
常常我們會這麼去寫一個文件
- try:
- f = open('ipython.txt','w')
- f.write("www.ipython.com")
- f.close()
- except IOError as err:
- print "file error:\n" + str(err)
- finally:
- if 'f' in locals():
- f.close()
實際上with可以看起來優樂美很多
- try:
- with open('ipython.txt','w') as f:
- f.write("www.ipython.me")
- except IOError as err:
- print "file error:\n" + str(err)
要使用 with 語句,首先要明白上下文管理器。有了上下文管理器,with 語句才能工作。
上下文管理協議(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持該協議的對象要實現這兩個方法。
上下文管理器(Context Manager):支持上下文管理協議的對象,這種對象實現了__enter__() 和 __exit__() 方法。上下文管理器定義執行 with 語句時要建立的運行時上下文,負責執行 with 語句塊上下文中的進入與退出操作。通常使用 with 語句調用上下文管理器,
也可以通過直接調用其方法來使用。
運行時上下文(runtime context):由上下文管理器創建,通過上下文管理器的 __enter__() 和__exit__() 方法實現,__enter__() 方法在語句體執行之前進入運行時上下文,__exit__() 在語句體執行完後從運行時上下文退出。with 語句支持運行時上下文這一概念。
上下文表達式(Context Expression):with 語句中跟在關鍵字 with 之後的表達式,該表達式要返回一個上下文管理器對象。
語句體(with-body):with 語句包裹起來的代碼塊,在執行語句體之前會調用上下文管理器的 __enter__() 方法,執行完語句體之後會執行 __exit__() 方法。
with語句的語法格式如下
- with context [as var(x)]:
- with-body
- ###這裏 context 要返回一個上下文管理器對象,該對象並不賦值給 as 子句中的 var(x) ,如果指定了 as 子句的話,會將上下文管理器的 __enter__() 方法的返回值賦值給 var(x)。var(x) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。###
- 不使用with的代碼可能是這樣的
- var = centext.__enter__()
- try:
- do_something(var)
- finally:
- context.__exit__()
- ###上下文管理器協議允許將無聊的try...except...finally結構抽象到一個單獨的類中,僅僅留下關注的do_something部分。###
- ##try...finally常見的用法是釋放資源。各種不同的情況實現相似:在__enter__階段資源被獲得,在__exit__階段釋放,如果拋出異常也被傳遞。正如文件操作,往往這是對象使用後的自然操作,內置支持使之很方便。###