【问题标题】:Is __exit__ called when using in parameter?使用 in 参数时是否调用了 __exit__?
【发布时间】:2017-04-03 06:41:56
【问题描述】:

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

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

可以发出“资源释放不当”吗?

【问题讨论】:

  • 不,__exit__ 方法不会被调用

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


【解决方案1】:

__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()

【讨论】:

    【解决方案2】:

    你可以在pythondata models documentation中找到关于这个的全面解释:

    某些对象包含对“外部”资源的引用,例如打开的文件或窗口。据了解,这些资源是在对象被垃圾回收时释放的,但由于垃圾回收不保证一定会发生,因此此类对象还提供了一种显式的方式来释放外部资源,通常是close()方法。强烈建议程序显式关闭此类对象。 try...finally 语句和 with 语句提供了方便的方法来执行此操作。

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

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

    通过这样做,上下文管理器将在块的末尾自动调用 __exit__ 方法,从而调用文件对象的 close 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多