【问题标题】:Will the file be closed after returning from function?从函数返回后文件会关闭吗?
【发布时间】:2016-09-07 01:08:15
【问题描述】:

这是一个python函数:

def read_data(filename):
    f = zipfile.ZipFile(filename)
    for name in f.namelist():
        return tf.compat.as_str(f.read(name))
    f.close()

文件会被关闭吗?调用没有错误。

【问题讨论】:

  • 我不太了解这里的缩进,您可能会遇到语法错误或对程序的意外解释。为什么for 语句相对于前面的变量声明缩进?
  • 另外,如果你修复缩进,答案是否定的,文件不会被关闭。您应该在此处使用with 子句,以便在您离开范围后自动释放文件句柄。
  • 您的代码也不会像第一次迭代中的return 那样遍历namelist...如果您正在寻找更多此函数的一个结果。
  • @AsadSaeeduddin 我很确定python在返回后不会执行打印方法,但不相信关闭文件。
  • @C.Zion Python 不会在返回后执行任何操作,对于名为 close 的方法没有特别的限制。

标签: python file zipfile


【解决方案1】:

文件不会被关闭。如果要关闭文件,可以这样写:

def read_data(filename):
    with zipfile.ZipFile(filename) as f:
        for name in f.namelist():
            return tf.compat.as_str(f.read(name))

测试您的代码:

使用with 测试代码:

【讨论】:

  • 从技术上讲,在 CPython 中,close 在释放对类文件对象的最后一个引用时隐式发生(例如,如果没有存储其他引用,则在函数返回时),但这是 CPython 引用的产物计数(并且它可能会被一些简单的事情暂时挫败,比如在回溯框架中保留本地人的异常);您应该始终尽可能使用with 块以获得可预测的关闭行为,因此不会被遗忘或意外跳过。
  • @wolframalpha 谢谢!
猜你喜欢
  • 2021-11-09
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多