文件名与文件对象作为函数参数

时间:2012-09-25 05:34:48

标签: python unit-testing python-3.x arguments software-design

如果一个函数将文本文件的名称作为输入,我可以将其重构为一个文件对象(我称之为“流”;是否有更好的词?)。优点显而易见 - 将流作为参数的函数是:

  • 更容易编写单元测试,因为我不需要为测试创建临时文件
  • 更灵活,因为我可以在我以某种方式已经拥有变量中文件内容的情况下使用它

溪流有什么缺点吗?或者我应该始终将函数从文件名参数重构为流参数(当然,假设文件是​​纯文本的)?

2 个答案:

答案 0 :(得分:6)

...以下是xml.etree.ElementTree模块实现parse函数的方式:

def parse(self, source, parser=None):
    close_source = False
    if not hasattr(source, "read"):
        source = open(source, "rb")
        close_source = True
    ...

由于filename是一个字符串,它没有read()方法(此处检查该名称的任何属性);但是,打开的文件有它。这四行使得其余的代码很常见。唯一的复杂因素是您必须记住是否关闭文件对象(此处名为source)。如果里面是open,则必须关闭它。否则,不得关闭。

实际上,文件与sream略有不同。流通常是无限的,而文件通常不是(除非某些设备被映射为好像它是文件)。处理时的重要区别是,您永远不能立即将流读入内存。你必须通过块来处理它。

答案 1 :(得分:4)

python标准库中有许多函数接受 - 文件名或打开文件对象的字符串(我假设你将其称为“流”)。创建一个可以用来使你的函数接受任何一个的装饰器真的不难。

使用“流”的一个严重缺点是,您将其传递给您的函数,然后您的函数从中读取 - 有效地改变它的状态。根据您的计划,如果有必要,恢复该状态可能会很混乱。 (例如,您可能需要使用f.tell()然后f.seek()来编写代码。)