第 15 章 上下文管理器和 else 块

最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要。目前,我们只了解了上下文管理器的皮毛……Basic 语言有 with 语句,而且很多语言都有。但是,在各种语言中 with 语句的作用不同,而且做的都是简单的事,虽然可以避免不断使用点号查找属性,但是不会做事前准备和事后清理。不要觉得名字一样,就意味着作用也一样。with 语句是非常了不起的特性。1

——Raymond Hettinger
雄辩的 Python 布道者

1节选自 PyCon US 2013 主题演讲“What Makes Python Awesome”(http://pyvideo.org/video/1669/keynote-3);关于 with 的部分从 23:00 开始,到 26:15 结束。

本章讨论其他语言中不常见的一些流程控制特性,正因如此,Python 用户往往会忽视或没有充分使用这些特性。下面要讨论的特性有:

with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。这么做能避免错误并减少样板代码,因此 API 更安全,而且更易于使用。除了自动关闭文件之外,with 块还有很多用途。

else 子句与 with 语句完全没有关系。可是已经写到第五部分了,我找不到其他地方介绍 else,又不能单写只有一页内容的一章,因此就在这一章讨论了。

下面从这个较小的话题开始,进入本章的实质内容。