Python with...as... 语法详解

Python with…as… 语法详解

  • Python 中 with 关键字基于上下文管理器实现,且内部封装了异常处理,常用于方便的执行资源回收,例如文件关闭等。

  • 所谓的上下文管理器,即实现了方法 __enter____exit__ 的类。

  • 实现了以上两个方法的类都可以与 with 关键字配合使用,例如:

    class Foo:
        def __enter__(self):
            print('call enter')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('call exit')
    
        def handle(self):
            print('call handle')
    
    if __name__ == '__main__':
        '''
        先调用 Foo 的 __enter__ 方法,这里 __enter__ 方法返回了 Foo 对象本身,
        然后将 Foo 对象赋值给 f 变量,接着再调用 Foo 对象的 handle 方法,
        最后,在离开 with 作用域之前,调用 Foo 对象的 __exit__ 方法
        '''
        with Foo() as f:
            f.handle()
        print('out of with')
    
    '''
    输出为:
    call enter
    call handle
    call exit
    out of with
    '''
    
  • with 关键字还封装了异常处理,所有的异常信息都会作为参数传递给 __exit__方法,例如:

    class Foo:
        def __enter__(self):
            print('call enter')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('call exit')
            print(exc_type, exc_val, exc_tb)
            # 返回 True 代表异常已被处理,否则,异常将继续向上抛出
            return True
    
        def handle(self):
            print('call handle')
            # 除 0 异常
            return 100 / 0
    
    if __name__ == '__main__':
        with Foo() as f:
            f.handle()
        print('out of with')
    
    '''
    输出为:
    call enter
    call handle
    call exit
    <class 'ZeroDivisionError'> division by zero <traceback object at 0x000001CDF3199100>
    out of with
    '''
    
  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注的罗哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值