Python标准库--contextlib模块

contextlib模块:上下文管理器工具

简单实现with...as...

as是__enter__返回的对象

__exit__返回True,则不抛出异常,返回False,则抛出异常

class WithinContext:
    def __init__(self, context):
        print('Within.__init__: ', context)

    def do_something(self):
        print('Within.do_something')
        raise RuntimeError('error message')

    def __del__(self):
        print('Within.__del__')


class Context:
    def __init__(self, handle_error):
        print('Contexxt.__init__(%s)' % handle_error)
        self.handle_error =handle_error

    def __enter__(self):
        print('Within.__enter__')
        return WithinContext(self)

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('Within.__exit__')
        print('   exc_type:',exc_type)
        print('   exc_val:', exc_val)
        print('   exc_tb:', exc_tb)
        return self.handle_error


with Context(True) as c:
    c.do_something()
with Context(False) as c:
c.do_something()

@contextlib.contextmanager

@contextlib.contextmanager
def make_context():
    print('  entering')
    try:
        yield {}
    except RuntimeError as e:
        print('  ERROR:', e)
    finally:
        print('  exiting')

with make_context() as value:
    print('  inside with statement:', value)
    # raise RuntimeError('showing RuntimeError')
    raise ValueError('this is not handled')

嵌套上下文

@contextlib.contextmanager
def make_context(name):
    print('  entering: ', name)
    try:
        yield name
    except RuntimeError as e:
        print('  ERROR:', e)
    finally:
        print('  exiting: ', name)


with make_context('A') as A, make_context('B') as B:
    print('  inside with statement:', A, B)

closing() 管理有close()的遗留类

class Door:
    def __init__(self):
        print('  __init__')

    def close(self):
        print('  close()')


try: 
    with contextlib.closing(Door()) as d:
        print('  raising inside with')
        raise RuntimeError('error message')
except Exception as e:
    print(' had an error:', e)

 

posted @ 2017-06-18 13:28  兔头咖啡  阅读(666)  评论(0编辑  收藏  举报


作者:兔头咖啡
出处:http://www.cnblogs.com/wj5633/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。