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

max*_*max 14 python unit-testing arguments software-design python-3.x

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

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

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

pep*_*epr 7

...以下是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
    ...
Run Code Online (Sandbox Code Playgroud)

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

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


mgi*_*son 4

python 标准库中有许多函数接受文件名或打开文件对象的字符串(我假设这就是您所说的“流”)。创建一个可以用来使您的函数接受其中任何一个的装饰器确实并不难。

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

  • 所以文件名与文件对象感觉有点像可迭代与迭代器。 (2认同)