我很好奇依赖 python 的 with...as 语句是否被认为是安全或良好的做法。例如打开文件时:
with open("myfile","w") as myFile:
#do something
所以在这个例子中我忽略了显式调用myFile.close()
但是我可以假设它是在 python通过调用 objects方法退出with...as
语句时调用的。__exit__()
依赖这个是好的做法/安全吗,还是总是明确地调用会更好file.close()
我很好奇依赖 python 的 with...as 语句是否被认为是安全或良好的做法。例如打开文件时:
with open("myfile","w") as myFile:
#do something
所以在这个例子中我忽略了显式调用myFile.close()
但是我可以假设它是在 python通过调用 objects方法退出with...as
语句时调用的。__exit__()
依赖这个是好的做法/安全吗,还是总是明确地调用会更好file.close()
这就是上下文管理器的用途,依靠它们为您关闭文件。即使出现异常,也会调用上下文管理器。
另一种方法是使用finally
块代替:
myFile = open("myfile","w")
try:
# do something with myFile
finally:
myFile.close()
但是因为里面的块try:
可能很长,当你到达finally
语句时,你已经忘记了你设置它的目的。
上下文管理器仍然更强大。因为该__exit__
方法被告知任何异常,它们也可以充当异常处理程序(忽略异常,引发另一个异常等)。
是的,with
声明是更好的方式。从 Python 2.5 开始,文件对象已经配备了__enter__()
和__exit__()
方法。该__exit__()
方法关闭文件对象。
Python 保证它会调用该__exit__()
方法,但不保证该__exit__()
方法会关闭资源,尤其是使用 3rd 方代码。您需要手动验证。