最终,上下文管理器可能几乎与子程序(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 语句和上下文管理器
for、while 和 try 语句的 else 子句
with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。这么做能避免错误并减少样板代码,因此 API 更安全,而且更易于使用。除了自动关闭文件之外,with 块还有很多用途。
else 子句与 with 语句完全没有关系。可是已经写到第五部分了,我找不到其他地方介绍 else,又不能单写只有一页内容的一章,因此就在这一章讨论了。
下面从这个较小的话题开始,进入本章的实质内容。