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

时间:2010-01-27 13:32:38

标签: file-io python

我想知道哪种更多'Pythonic'/更好的方法来编写处理文件的方法。处理文件的方法是否应该关闭该文件作为副作用?数据的概念是一个'文件'是否应该从处理数据的方法中完全抽象出来,这意味着它应该期待一些'流'但不一定是文件?:

举个例子,可以这样做:

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 个答案:

答案 0 :(得分:4)

通常,文件的开启者最好关闭文件。在你的问题中,第二个例子更好。

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

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

答案 1 :(得分:4)

使用with意味着不必担心这一点。

至少,不是2.5 +。

答案 2 :(得分:0)

不,因为它降低了灵活性:如果函数没有关闭文件而调用者不需要它 - 调用者可以关闭文件。如果确实如此,但调用者仍然需要打开文件 - 调用者无法重新打开文件,使用StringIO或其他东西。

同样关闭文件对象需要对其真实类型进行额外的假设(对象可以支持.read()或.write(),但没有有意义的.close()),这会阻碍鸭子输入。

文件-left-open对于CPython来说不​​是问题 - 它会在某些东西(open('somefile'))之后立即关闭垃圾收集。 (其他实现也将gc和关闭文件,但在未指定的时刻)