在这个单行代码中,当调用方法作为参数但不释放资源时,在方法完成时调用__exit__
?
hashlib.md5(open("PATH", 'rb').read()).hexdigest()
可以发布关于“不正当资源释放”的信息。 ?
答案 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方法。