如何验证python';什么是IOBase?

如何验证python';什么是IOBase?,python,testing,io,Python,Testing,Io,是否有一个现有的测试套件可以用来测试IOBase的实现?如果可能的话,我想彻底测试一个新的实现,但是有很多测试需要手工编写 例如,假设我有一个不可查找、不可写的流。我想验证我的read实现是否兼容,以及所有其他方法是否会引发正确类型的错误。这样的类可能如下所示: import io class NonSeekableReader(io.RawIOBase): def __init__(self, b=b''): super(NonSeekableReader, sel

是否有一个现有的测试套件可以用来测试
IOBase
的实现?如果可能的话,我想彻底测试一个新的实现,但是有很多测试需要手工编写

例如,假设我有一个不可查找、不可写的流。我想验证我的
read
实现是否兼容,以及所有其他方法是否会引发正确类型的错误。这样的类可能如下所示:

import io


class NonSeekableReader(io.RawIOBase):
    def __init__(self, b=b''):
        super(NonSeekableReader, self).__init__()
        self._data = io.BytesIO(b)

    def seekable(self):
        return False

    def writable(self):
        return False

    def readable(self):
        return True

    def read(self, n=-1):
        return self._data.read(n)
也许阅读的作品和我最初期望的一样,但也许在更复杂的实现中我会错过一些边缘案例。实验表明,文档对于预期的行为是什么,至少是最容易混淆的

基于此,我可以看到,通过定义
writeable
返回
False
write
应该会产生
OSError
(在Python 3.5中)。这实际上不是真的,当从
RawIOBase
继承时,它将引发
NotImplementedError
,或者当从
IOBase
继承时,它将引发
AttributeError
。此行为在可查找的
中不重复,即调用
.tell()
会引发正确的错误。为了解决这个问题,我定义
write
如下:

def write(self, b):
    raise io.UnsupportedOperation("write")
值得注意的是,使用
'r'
打开的文件会产生预期的错误类

由于在链接文档页面之外没有关于实现这些接口(我已经找到)的一般指导,我甚至没有必要考虑检查这个问题。一个预先存在的测试套件可以解决这个问题。否则,对必要测试或边缘案例的描述将指导我解决这些问题

我还没有找到这样的指导吗?

  • Python文档是唯一一个官方、权威的源代码,其中包含关于股票实现行为的承诺/保证——没有其他正式发布的内容。如果某件事没有记录在案,它就不存在,不应该依赖它

    • 源repo中有一个针对
      io
      模块
      test\u io.py
      的单元测试(您也可以选择使用解释器安装测试套件)。根据您在下一段中的回答,一定要注意具体实施的细节。
      • 还要注意基类的
        io
        实现的具体细节:,基类有一个规范,它的派生类也有一个规范
  • 有些行为是特定于实现的,并且在Python实现之间确实有所不同(例如,在IronPython中,
    sys.maxsize
    大得离谱,因为在.NET中没有这样的机制,所有字符串都是Unicode的,即使它实现了Python 2)

    • 这里的问题是:您的目标编译是使用规范还是使用特定的实现?答案取决于您希望与多少代码兼容(以及编写得有多好(或者更确切地说,编写得不好,即不可移植)。
      • 因为我们在这里讨论的是抽象类,所以除了相关实体中的少量默认/非抽象代码之外,实际上没有“特定实现”。所以差别很小
  • 现在,确实有一些情况下,规范忽略了一些关键细节,或者对这些细节含糊不清(我个人在
    ctypes
    中至少遇到过两种情况)。这是因为它是作为用户指南而不是实现者指南编写的

    • 在这里,除了遵守规范并在遇到问题时进行修复之外,你什么也做不了。在模糊的情况下,您可以检查实现,但一定要找出基本原理(概念上它打算做什么),以决定什么适合您的情况。毕竟,如果您要更换一个内部模块,您如何知道其他内部模块依赖多少未记录的行为?
      • 值得赞扬的是,后一种情况应该非常罕见,因为它们尊重松耦合原则,并努力在模块间交互中遵守规范(有规范的地方)

RawIOBase
IOBase
是基类。编写具体的类是您的职责,这样它们才符合要求,但我正在寻找关于如何验证这一点的更精确的指导。我想避免一些不明显的边缘情况和混音的潜在问题。哎哟,我刚刚意识到我忘了把这个标记为已回答。