《流畅的Python》第十五章学习笔记


取得原谅比获得许可容易

else块

else子句不仅能在if语句中使用,还能在for、while和try语句中使用。

for

仅当for循环运行完毕(没有被break语句终止)才运行else块

while

仅当while循环因条件为假值而退出(没有被break语句终止)才运行else块

try

仅当try块中没有异常抛出时才运行else块

with块

with不仅能管理资源,还能用于去掉常规的设置和清理代码,或者在另一个过程前后只想的操作。

with语句的目的是简化try/finally模式

这种模式用于保证一段代码运行完毕后执行某项操作,即使那段代码由于异常returnsys.exit()调试而中止,也会执行指定的操作

  • with语句开始的时候会在上下文管理对象上调用__enter__方法

  • with语句结束的时候户在上下文管理对象上调用exit方法

exit的三个参数

def __exit__(self, exc_type, exc_value, traceback)
exc_type:异常类
exc_value:异常实例

有时会有参数传给异常构方法,例如错误消息,这些参数可以使用exc_value.args获取

trackback:异常的堆栈信息

使用@contextmanager

不用编写完整的__enter____exit__函数,只需要实现有一个yield语句的生成器

yield把函数分为了两部分,

  • 上半部分相当于enter中的内容

  • 下半部分相当于exit中的内容

class A(object):
    def __enter__(self):
        print("进入")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("退出")


if __name__ == '__main__':
    with A():
        print('test')
        assert 0
import contextlib


@contextlib.contextmanager
def B():
    print("进入")
    try:
        yield
    finally:
        print("退出")


if __name__ == '__main__':
    with B() as b:
        print('test1')
        assert 0

上述两段代码的实现效果是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值