我很好奇是否认为安全或良好的做法依赖于python的...作为声明。例如,打开文件时:
with open("myfile","w") as myFile:
#do something
所以在这个例子中我忽略了显式调用myFile.close()
但是我可以假设当python通过调用对象with...as
方法退出__exit__()
语句时调用它。依赖于此是好的做法/安全还是总是明确地呼叫file.close()
答案 0 :(得分:19)
这就是 for 的上下文管理器,依靠他们为您关闭文件。即使存在异常,也会调用上下文管理器。
另一种方法是改为使用finally
块:
myFile = open("myfile","w")
try:
# do something with myFile
finally:
myFile.close()
但是因为try:
内部的区块可能很长,所以当您进入finally
语句时,您已经忘记了为此设置的内容。
上下文管理器仍然更强大。因为__exit__
方法被告知任何异常,所以它们也可以充当异常处理程序(忽略异常,引发异常等)。
答案 1 :(得分:4)
是的,with
声明是更好的方法。从Python 2.5开始,文件对象已经配备了__enter__()
和__exit__()
方法。 __exit__()
方法关闭文件对象。
Python保证它将调用__exit__()
方法,但不保证__exit__()
方法将关闭资源,尤其是第三方代码。您需要手动验证。