Python上下文管理器
首先造一个传统意义上的上下文管理器:
它其实有个等价写法:
也就是说,以下两种写法都能实现上下文管理:
唯一的区别就是,如果使用 contextmanager 制作装饰器类型的上下文管理器,当你的代执行内容报错的时候,yield处是没有处理错误逻辑的代码的。也就是使用 @TimerContextManager() 会在抛出 TypeError 后打印出 cost_time,但是使用 @contextmanager 的 @timer() 不会抛出。
如果你希望它抛出,需要加一个异常处理:
你也可以选择不抛出错误而是记录一个 message,最终定制错误类型并且将这个 message打印/日记记录出来。怎么操作是你的事情。
这个东西很好用,你可以用它来做异步爬虫 session、数据库连接池、日志工具。