contextlib模塊

說明: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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章