14

我很好奇依赖 python 的 with...as 语句是否被认为是安全或良好的做法。例如打开文件时:

with open("myfile","w") as myFile:
    #do something

所以在这个例子中我忽略了显式调用myFile.close()但是我可以假设它是在 python通过调用 objects方法退出with...as语句时调用的。__exit__()依赖这个是好的做法/安全吗,还是总是明确地调用会更好file.close()

4

2 回答 2

20

这就是上下文管理器的用途,依靠它们为您关闭文件。即使出现异常,也会调用上下文管理器。

另一种方法是使用finally块代替:

myFile = open("myfile","w")
try:
    # do something with myFile
finally:
    myFile.close()

但是因为里面的块try:可能很长,当你到达finally语句时,你已经忘记了你设置它的目的。

上下文管理器仍然更强大。因为该__exit__方法被告知任何异常,它们也可以充当异常处理程序(忽略异常,引发另一个异常等)。

于 2013-02-08T16:18:34.250 回答
4

是的,with声明是更好的方式。从 Python 2.5 开始,文件对象已经配备了__enter__()__exit__()方法。该__exit__()方法关闭文件对象。

Python 保证它会调用该__exit__()方法,但不保证该__exit__()方法会关闭资源,尤其是使用 3rd 方代码。您需要手动验证。

于 2013-02-08T16:31:32.390 回答