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)

 

转载于:https://www.cnblogs.com/wj5633/p/7044132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值