說明:contextlib是爲了加強with語句,提供上下文機制的模塊,它是通過Generator實現的。通過定義類以及寫__enter__和__exit__來進行上下文管理;
contextlib中有nested和closing,前者用於創建嵌套的上下文,後則用於幫你執行定義好的close函數.
#!/usr/bin/env python #coding:utf-8 class WithinContext(object): def __init__(self,context): print "WithinContext.__init__(%s) " %context def do_something(self): print "WithinContext.do_something()" def __del__(self): print "WithinContext.__del__" class Context(object): def __init__(self): print "Context.__init__()" def __enter__(self): """ 在主體代碼執行前執行 """ print "Context.__enter__()" return WithinContext(self) def __exit__(self,exc_type,exc_val,exc_tb): """ 在主體代碼執行後執行 """ print "Context.__exit__()" with Context() as c : """ as後面的變量是在__enter__函數中返回的 """ c.do_something() #執行結果: Context.__init__() Context.__enter__() WithinContext.__init__(<__main__.Context object at 0x7f95045167d0>) WithinContext.do_something() Context.__exit__() WithinContext.__del__
contextlib中的contextmanager作爲裝飾器來提供一種針對函數級別的上下文管理機制.
#!/usr/bin/env python #coding:utf-8 import contextlib @contextlib.contextmanager def make_context(): print "entering" try: yield {} finally: print "exiting" with make_context() as value: print "inside with statement:", value #執行結果: entering inside with statement: {} exiting @contextlib.contextmanager def make_context(name): print "entering",name yield name print "exiting",name with contextlib.nested(make_context('A')) as (c): print "inside with statement: ",c #執行結果: entering A inside with statement: ['A'] exiting A with contextlib.nested(make_context('A'),make_context("B"),make_context("C")) as (A,B,C): """ nested用於創建嵌套的上下文 """ print "inside with statement: ",A,B,C #執行結果: entering A entering B entering C inside with statement: A B C exiting C exiting B exiting A class Door(object): def __init__(self): print "__init__()" def close(self): print "close()" return with contextlib.closing(Door()) as door: """ closing執行定義好的close函數 """ print "inside with statement." #執行結果: __init__() inside with statement. close()