看這個模塊要先看with as的用法,最常用的方法就是打開一個文件:
with open(“filename”) as f:
f.read()
with可以調用一個上下文管理器,產生運行時的上下文環境。上下文管理器主要定義兩個方法,__enter__,__exit__。__enter__返回上下文里操作的對象,如f。__exit__是銷毀對象和異常處理。
contextlib模塊對外有三個接口,
contextmanager裝飾器,裝飾的函數必須是一個生成器。然后返回一個函數,在函數調用的時候返回一個上下文管理器。
nested為了一次調用多個上下文管理器的時候用,將所有上下文管理器里的__enter__放到vars里,一次yield返回,然后unpack。就產生多個對象了。__exit__都放到exits列表里,在finally里統一調用,這些__exit__在調用上下文管理器產生異常時,如何處理。如果返回false,將會把異常繼續拋出,返回true則不會拋出異常。
closing,這個用過,沒想到的是竟然是個類,而不是個函數。就是把有close方法卻沒有__exit__方法的對象變成一個上下文管理器。代碼很簡單:
class closing(object):
def __init__(self, thing):
self.thing = thing
def __enter__(self):
return self.thing
def __exit__(self, *exc_info):
self.thing.close()