• 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)
  • 相关阅读:
    浅浅地聊一下矩阵与线性映射及矩阵的特征值与特征向量
    再谈正态分布或高斯函数
    喜好:
    Deep Residual Learning for Image Recognition这篇文章
    Java并发编程:volatile关键字解析
    mysql decimal(10,2)对应java类型
    各个JSON技术的比较(Jackson,Gson,Fastjson)的对比
    @RequestBody和@RequestParam区别
    Java中的ReentrantLock和synchronized两种锁定机制的对比
    使用Solr索引MySQL数据
  • 原文地址:https://www.cnblogs.com/wj5633/p/7044132.html
Copyright © 2020-2023  润新知