这章讨论上下文管理器问题以及一些控制结构中附加的else语句事项。
与其它常见语言不同,Python设计了一个特殊的else控制流程。除了标准的if/else之外,它给for/while/try控制块都增加了else控制流程。它的执行行为是:
for : 仅当for循环完毕,没有被break中止才执行else
while:仅当条件因为False值退出时(没有被break)才执行else
try:仅当try块没有异常抛出,才执行else
但是作者提到,他认为除了if语句之外,其它语句选择使用else关键字是错误的。else蕴涵着“排他性”含义,要么这样,要么那样。但是在循环中,else的语义恰好相反:运行循环,然后做这个。因此,使用”then”更佳。对于try,then也说得通。但是Python的“仁慈独裁者”,坚决不肯增加Python语言关键字,这个问题只得如此。你就当它是then去理解就好了。
上下文管理器关键字是:”with”。它的目的是简化操作。它可以保证,进入、退出此语句块,必要的操作,可以在__enter__和__exit__两个方法中得到执行。比如获取资源,清理资源。其它语言比如JavaScript,也有with关键字,但是:它的设计是错误的,以至于“strict”模式下无法使用。这点在《JavaScript语言精粹》中有提及,有兴趣的可以了解下。
常见的一个用法就是打开文件,然后关闭。如果不使用with,很多人会忘记关闭文件,这造成一些问题。而打开文件的操作,是支持”with”协议的,只要退出with程序块,文件一定可以关闭。
除了自己实现with功能,还可以使用contextlib模块里面的工具,比如@contextmanager装饰器协助实现。具体需要参考文档。