【发布时间】:2017-04-03 06:41:56
【问题描述】:
在这个单行代码中,当调用一个方法作为参数,但不释放资源时,__exit__在方法完成时被调用?
hashlib.md5(open("PATH", 'rb').read()).hexdigest()
可以发出“资源释放不当”吗?
【问题讨论】:
-
不,
__exit__方法不会被调用
标签: python python-2.7 python-3.x file
在这个单行代码中,当调用一个方法作为参数,但不释放资源时,__exit__在方法完成时被调用?
hashlib.md5(open("PATH", 'rb').read()).hexdigest()
可以发出“资源释放不当”吗?
【问题讨论】:
__exit__ 方法不会被调用
标签: python python-2.7 python-3.x file
__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()
【讨论】:
你可以在pythondata models documentation中找到关于这个的全面解释:
某些对象包含对“外部”资源的引用,例如打开的文件或窗口。据了解,这些资源是在对象被垃圾回收时释放的,但由于垃圾回收不保证一定会发生,因此此类对象还提供了一种显式的方式来释放外部资源,通常是
close()方法。强烈建议程序显式关闭此类对象。try...finally语句和with语句提供了方便的方法来执行此操作。
也就是说,您打开的对象不会被关闭,因为您没有调用打开对象的close 属性。如果您没有明确调用关闭,您应该将代码包装在 with 语句中:
with open("PATH", 'rb') as f:
hashlib.md5(f.read()).hexdigest()
通过这样做,上下文管理器将在块的末尾自动调用 __exit__ 方法,从而调用文件对象的 close 方法。
【讨论】: