本章从简单的话题入手,先讨论了 for、while 和 try 语句的 else 子句。当你习惯 else 子句在这些语句中的奇怪意思之后,我相信 else 能阐明你的意图。
然后,本章讨论了上下文管理器和 with 语句的作用。很快我们就知道,除了自动关闭打开的文件之外,with 语句还有很多用途。我们自己动手实现了一个上下文管理器——含有 __enter__/__exit__ 方法的 LookingGlass 类,说明了如何在 __exit__ 方法中处理异常。 Raymond Hettinger 在 PyCon US 2013 上所做的主题演讲传达了一个重要的观点:with 不仅能管理资源,还能用于去掉常规的设置和清理代码,或者在另一个过程前后执行的操作(“What Makes Python Awesome?”,第 21 张幻灯片,https://speakerdeck.com/pyconslides/pycon-keynote-python-is-awesome-by-raymond-hettinger?slide=21)。
最后,我们分析了标准库中 contextlib 模块里的函数。其中,@contextmanager 装饰器能把包含一个 yield 语句的简单生成器变成上下文管理器——这比定义一个至少包含两个方法的类要更简洁。我们使用 looking_glass 生成器函数实现了 LookingGlass 类,还讨论了使用 @contextmanager 时如何处理异常。
@contextmanager 装饰器优雅且实用,把三个不同的 Python 特性结合到了一起:函数装饰器、生成器和 with 语句。