Python with 語句淺析

Python with 語句淺析

python-logo

python的with 語句作爲 try/finally 編碼範式的一種替代,用於對資源訪問進行控制的場合,此文也是今晚看書產生的寫博心態,基於一個寫文件的小例子來擼一下with語句,能擼多遠擼多遠

 

常常我們會這麼去寫一個文件

  1. try:
  2. f = open('ipython.txt','w')
  3. f.write("www.ipython.com")
  4. f.close()
  5. except IOError as err:
  6. print "file error:\n" + str(err)
  7. finally:
  8. if 'f' in locals():
  9. f.close()

 

實際上with可以看起來優樂美很多

  1. try:
  2. with open('ipython.txt','w') as f:
  3. f.write("www.ipython.me")
  4. except IOError as err:
  5. 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語句的語法格式如下

  1. with context [as var(x)]:
  2. with-body
  3.  
  4. ###這裏 context 要返回一個上下文管理器對象,該對象並不賦值給 as 子句中的 var(x) ,如果指定了 as 子句的話,會將上下文管理器的 __enter__() 方法的返回值賦值給 var(x)。var(x) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。###
  5.  
  6.  
  7. 不使用with的代碼可能是這樣的
  8. var = centext.__enter__()
  9. try:
  10. do_something(var)
  11. finally:
  12. context.__exit__()
  13.  
  14. ###上下文管理器協議允許將無聊的try...except...finally結構抽象到一個單獨的類中,僅僅留下關注的do_something部分。###
  15.  
  16. ##try...finally常見的用法是釋放資源。各種不同的情況實現相似:在__enter__階段資源被獲得,在__exit__階段釋放,如果拋出異常也被傳遞。正如文件操作,往往這是對象使用後的自然操作,內置支持使之很方便。###
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章