在参数中使用是否__exit__?

时间:2017-04-03 06:41:57

标签: python python-2.7 python-3.x file

在这个单行代码中,当调用方法作为参数但不释放资源时,在方法完成时调用__exit__

hashlib.md5(open("PATH", 'rb').read()).hexdigest()

可以发布关于“不正当资源释放”的信息。 ?

2 个答案:

答案 0 :(得分:3)

__exit__不会被调用,__exit__会在with-statement结束时触发。

在CPython __del__中最终将被触发,因为此文件对象不再引用it will close the file

但我们建议您使用with-statement来确保close()来电显然不是隐含的,这样您就不会依赖于实施细节。

with open("PATH", 'rb') as f:
    hash = hashlib.md5(f.read()).hexdigest()

答案 1 :(得分:1)

你可以在python data models documentation中找到一个全面的解释:

  

某些对象包含对“外部”资源的引用,例如打开的文件或窗口。可以理解,当对象被垃圾收集时,这些资源被释放,但由于不能保证垃圾收集发生,这些对象还提供了一种释放外部资源的明确方法,通常是close()方法。强烈建议程序明确关闭此类对象。 try...finally语句和with语句提供了方便的方法。

那就是说你打开的对象不会被关闭,因为你没有调用打开对象的close属性。如果您没有明确地调用关闭,则应将代码包装在with语句中:

with open("PATH", 'rb') as f:
    hashlib.md5(f.read()).hexdigest()

通过执行上下文管理器将在块结束时自动调用__exit__方法,因此它将调用文件对象的close方法。