Python:确定一个对象是否像文件一样?

时间:2010-08-10 15:52:37

标签: python file types

我正在为我的应用程序编写一些单元测试(使用unittest模块),并希望编写一些可以验证我正在调用的方法返回“类文件”对象的东西。由于这不是一个简单的异常调用,我想知道确定这个的最佳实践是什么?

所以,概括地说:

possible_file = self.dao.get_file("anotherfile.pdf")
self.assertTrue(possible_file is file-like)

也许我不得不关心这个文件对象实现了哪个特定的接口,或者哪些方法使它像文件一样我想支持?

谢谢,

[R

3 个答案:

答案 0 :(得分:7)

对于哪些对象“足够类似文件”没有“官方定义”,因为类文件对象的各种用途具有这样的不同要求 - 例如,有些仅需要read或{{1方法,其他需要各种线读取方法的一些子集...一些需要write方法的方法,甚至不能由“非常类文件的对象”提供标准库中的filenoStringIO个模块。这绝对是一个“灰色阴影”的问题,不是一个黑白分类法!

因此,您需要确定 需要哪些方法。要检查它们,我建议您使用cStringIO装饰器定义自己的FileLikeEnoughForMe abstract base class,并使用abstractmethod检查该对象,如果您使用的是Python 2.6或者更好:这是现在推荐的习惯用语,而不是一堆isinstance检查,这些检查的可读性和复杂性较低(当检查这些属性实际上是方法等时适当加强; - )。< / p>

答案 1 :(得分:4)

经典的Python心态是,更容易请求宽恕而非许可。换句话说,不要检查,捕获由write引起的异常。

新方法是在isinstance支票中使用IO abstract base class。这是在人们意识到鸭子打字很棒的时候引入的,但有时你确实需要实例检查。

在您的情况下(单元测试),您可能想尝试一下并看到:

thingy = ...
try:
    thingy.write( ... )
    thingy.writeline( ... )
    ...
    thingy.read( )
except AttributeError:
    ...

答案 2 :(得分:2)

检查,如果返回的对象提供了您正在寻找的界面。像这样举例如:

self.assert_(hasattr(possible_file, 'write'))
self.assert_(hasattr(possible_file, 'read'))