with context expression [as target(s)]:
with 程式碼塊
import codecs # 使用with語句開啟檔案,該語句會負責關閉檔案 with codecs.open("readlines_test.py", 'r', 'utf-8', buffering=True) as f: for line in f: print(line, end='')程式也可以使用 with 語句來處理通過 fileinput.input 合併的多個檔案,例如如下程式:
import fileinput # 使用with語句開啟檔案,該語句會負責關閉檔案 with fileinput.input(files=('test.txt', 'info.txt')) as f: for line in f: print(line, end='')上面兩個程式都使用了 with 語句來管理資源,因此它們都不需要顯式關閉檔案。
class FkResource: def __init__(self, tag): self.tag = tag print('構造器,初始化資源: %s' % tag) # 定義__enter__方法,with體之前的執行的方法 def __enter__(self): print('[__enter__ %s]: ' % self.tag) # 該返回值將作為as子句中變數的值 return 'fkit' # 可以返回任意型別的值 # 定義__exit__方法,with體之後的執行的方法 def __exit__(self, exc_type, exc_value, exc_traceback): print('[__exit__ %s]: ' % self.tag) # exc_traceback為None,代表沒有異常 if exc_traceback is None: print('沒有異常時關閉資源') else: print('遇到異常時關閉資源') return False # 可以省略,預設返回None也被看做是False with FkResource('孫悟空') as dr: print(dr) print('[with程式碼塊] 沒有異常') print('------------------------------') with FkResource('白骨精'): print('[with程式碼塊] 異常之前的程式碼') raise Exception print('[with程式碼塊] ~~~~~~~~異常之後的程式碼')上面程式定義了一個 FkResource 類,該類定義了 __enter__() 和 __exit__() 兩個方法,因此該類的物件可以被 with 語句管理:
構造器,初始化資源: 孫悟空
[__enter__ 孫悟空]:
fkit
[with程式碼塊] 沒有異常
[__exit__ 孫悟空]:
沒有異常時關閉資源
------------------------------
構造器,初始化資源: 白骨精
[__enter__ 白骨精]:
[with程式碼塊] 異常之前的程式碼
[__exit__ 白骨精]:
遇到異常時關閉資源
Traceback (most recent call last):
File "C:UsersmengmaDesktop1.py", line 26, in <module>
raise Exception
Exception