如果我执行以下操作,文件句柄是否会在超出 Python 范围时自动关闭:
def read_contents(file_path):
return file(file_path).read()
如果没有,我该如何编写这个函数来自动关闭作用域?
最佳答案
为了扩展 FogleBird 的答案,如果您没有明确关闭它,那么当文件对象被销毁时,文件将自动关闭。在 CPython 中,只要不再引用它就会发生这种情况,例如如果它是函数中的局部变量并且函数结束。但是,如果函数中抛出异常并且文件没有使用 with
语句或 try:...finally:
显式关闭,则对该文件的引用将是作为堆栈跟踪的一部分保留在 traceback 对象中,并且文件不会关闭,至少在引发下一个异常之前不会关闭。
IronPython 和 Jython 也分别使用 .Net CLR 和 Java JVM 的垃圾收集工具。这些不是引用计数的,因此文件将无限期保持打开状态,直到垃圾收集器决定回收对象的内存或程序终止。
因此,一般来说,使用 with:
或 try:...finally:
显式关闭文件很重要。
当然,所有其他类型的需要显式清理的对象都适用。
关于python - 超出范围后,文件句柄是否会在 Python 中自动关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404430/