代码之家  ›  专栏  ›  技术社区  ›  Chris Lawlor

处理文件的类或方法是否应作为副作用关闭文件?

  •  2
  • Chris Lawlor  · 技术社区  · 16 年前

    我想知道哪种方法更适合写处理文件的方法。处理该文件的方法是否应作为副作用关闭该文件?数据是“文件”的概念是否应该完全从处理数据的方法中抽象出来,这意味着它应该期望一些“流”,但不一定是一个文件?以下内容:

    例如,可以这样做吗:

    process(open('somefile','r'))
    ... carry on
    

    在哪里? process() 关闭文件句柄:

    def process(somefile):
        # do some stuff with somefile
        somefile.close()
    

    或者这更好:

    file = open('somefile','r')
    process(file)
    file.close()
    

    就其价值而言,我通常使用python来编写相对简单的脚本,这些脚本的目的非常明确,我可能是唯一一个使用它们的脚本。也就是说,我不想教自己任何不好的做法,我宁愿学习做事情的最佳方法,因为即使是一份小工作也值得做好。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Aaron    16 年前

    一般来说,最好的做法是打开文件以关闭文件。在您的问题中,第二个例子更好。

    这是为了防止可能的混淆和无效操作。

    编辑: 如果您的实际代码并不比示例代码复杂,那么最好让process()打开并关闭该文件,因为调用者不会将该文件用于任何其他用途。只需输入文件的路径/名称。但是,如果可以想象,process()的调用者将在关闭文件之前使用该文件,那么将该文件保留在process()之外的open和close操作。

        2
  •  4
  •   Ignacio Vazquez-Abrams    16 年前

    使用 with 意思是不用担心这个。

    至少,不是2.5+。

        3
  •  0
  •   ymv    16 年前

    不,因为它降低了灵活性:如果函数不关闭文件,而调用者不需要它-调用者可以关闭文件。如果有,但调用者仍然需要打开文件-调用者坚持重新打开文件、使用Stringio或其他方法。

    另外,关闭文件对象需要对它的实际类型进行额外的假设(对象可以支持.read()或.write(),但没有有意义的.close()),从而阻碍了duck类型的输入。

    而对于cpython来说,保持打开的文件并不是问题——它将在垃圾收集之后立即关闭(open(“somefile”)。(其他实现也将GC和关闭文件,但在未指定的时刻)