Python contextmanager()vs closing():哪个适合流对象?

时间:2016-07-25 04:13:25

标签: python contextmanager

在使用contextlib定义用于with的自定义“open”函数的another answer here中,来自contextlib的contextmanager用于定义处理数据打开和流的函数,最后关闭了流。

在了解这一点时,我发现还有一个closing函数似乎工作方式类似,特别关注完成时关闭流。

我理解contextmanager构造如何工作(必要时明确关闭流),但我想知道它是否不完整 - 为了正确性(并且是Pythonic),应该closing参与好吧,还是首选?

编辑:我所提到的答案目前调用了fh.close() - 我想知道某种方式closing是否应该以某种方式介入contextlib而不是那样。关于function confirmation(){ var confirmVal = window.confirm("Please confirm?"); if( confirmVal == true ){ return true; } } 的文档首先没有帮助我解决这个问题,所以这个问题。

1 个答案:

答案 0 :(得分:1)

在答案中将contextlib.closing粘贴在上下文管理器中是完全不合适的,原因有很多:

  1. 他们并不总是想要关闭文件!该上下文管理器专门用于有时保持文件打开。这就是编写上下文管理器的全部原因。
  2. 当他们想要关闭文件时,上下文管理器已经这样做了。
  3. 在上下文管理器周围环绕closing会尝试关闭错误的对象。
  4. 如果您始终要关闭文件,则通常既不需要closing也不需要自定义上下文管理器,因为文件已经是上下文管理器。在with语句中粘贴文件将在最后关闭它而不需要任何特殊包装。