72. with语句是如何确保文件的正常关闭的

with语句用于用上下文管理器定义的方法来包装一个块的执行。这允许“try…except…finally” 使用模式被封装起来方便。对文件的操作经常使用with语句。例如:

with open(TESTFN, "wb") as fp:
    fp.write(self.data)

在执行结束后,fp自动被关闭。with语句的实际执行顺序如下:

1,对上下文表达式进行评估,以获得上下文管理器。

2,上下文管理器的__exit__()被加载以供以后使用。

3, 调用上下文管理器的__enter__()方法。

4, 如果在with语句中包含一个as目标,则将__enter__()的返回值赋给它。

请注意 with语句保证如果__enter__()方法返回时没有出错,那么__exit__() 将始终被调用。因此,如果在目标列表的赋值过程中出现错误,则将处理与该 套件中发生的错误相同的错误。请参阅下面的步骤6。

5, 将执行该with语句内部的嵌套语句。

6,调用上下文管理器的__exit__()方法。如果一个异常导致该语句块退出,它的类型

、值和traceback作为参数传递给__exit__()。否则,将提供三个None参数。

详细请参考:https://docs.python.org/3/reference/compound_stmts.html#the-with-statement