以...作为声明依赖python是一种好习惯

时间:2013-02-08 16:16:58

标签: python with-statement contextmanager

我很好奇是否认为安全或良好的做法依赖于python的...作为声明。例如,打开文件时:

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

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

会更好

2 个答案:

答案 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__()方法将关闭资源,尤其是第三方代码。您需要手动验证。