引言
with 語句是從 Python 2.5 開始引入的一種與異常處理相關的功能(2.5 版本中要通過 from __future__ import with_statement 導入后才可以使用),從 2.6 版本開始缺省可用(參考 What's new in Python 2.6? 中 with 語句相關部分介紹)。with 語句適用于對資源進行訪問的場合,確保不管使用過程中是否發生異常都會執行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。
術語
要使用 with 語句,首先要明白上下文管理器這一概念。有了上下文管理器,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 語句的語法格式
with context_expression [as target(s)]: with-body
這里 context_expression 要返回一個上下文管理器對象,該對象并不賦值給 as 子句中的 target(s) ,如果指定了 as 子句的話,會將上下文管理器的 __enter__() 方法的返回值賦值給 target(s)。target(s) 可以是單個變量,或者由“()”括起來的元組(不能是僅僅由“,”分隔的變量列表,必須加“()”)。
Python 對一些內建對象進行改進,加入了對上下文管理器的支持,可以用于 with 語句中,比如可以自動關閉文件、線程鎖的自動獲取和釋放等。假設要對一個文件進行操作,使用 with 語句可以有如下代碼:
清單 2. 使用 with 語句操作文件對象
with open(r'somefileName') as somefile: for line in somefile: print line # ...more code
新聞熱點
疑難解答