首先,“标准的 Python 数据结构接口”不是列表、集合、字典、队列等。它们是接口的具体实现。(并且队列甚至不是您所想的数据结构——它的显着特点是它的操作是原子的,put
并且get
可以选择在 a 上同步Condition
,等等。)
无论如何,接口以五种不同的不太兼容的方式定义。
文档的内置类型部分描述了迭代器类型、序列类型等的含义。但是,这些并不像您对参考文档所期望的那样严格(至少如果您习惯于,比如说,C++ 或 Java)。
我不知道对这种东西有任何测试,所以我认为你必须从头开始构建它们。
该collections
模块包含定义接口的集合抽象基类,并提供一种通过abc
模块注册“虚拟子类”的方法。collections.Mapping
所以,你可以通过继承或调用来声明“我是一个映射” collections.Mapping.register
。但这实际上并不能证明你是一个映射,只是你声称是。(如果你继承自Mapping
,它也可以作为一个 mixin 帮助你通过实现来完成接口,例如,__contains__
在 之上__getitem__
。)
如果你想测试 ABC 的意思,defuz 的答案非常接近,而且我认为他或其他人可以通过更多的工作来完成它。
CPython C API 定义了一个抽象对象层。虽然这实际上并不是该语言的权威,但显然 C-API 协议和语言级接口应该匹配。而且,与后者不同的是,前者是严格定义的。当然,来自CPython 2.7的源代码,也许还有像PyPy这样的其他实现,可能会有所帮助。
CPython 附带了对此的测试,但实际上,它们是用于测试PyMapping_GetItem
从 C 调用mymapping.__getitem__
在 Python 中正确调用你的,这实际上与你想要测试的内容相切,所以我认为它不会有帮助很多。
实际的具体类在协议之上有额外的接口,您可能想要测试,但这更难描述。特别是,方法__new__
和__init__
方法的工作方式通常很重要。实现该Mapping
协议意味着有人可以构造一个空Foo
实例并使用 向其中添加项目foo[key] = value
,但这并不意味着有人可以构造Foo(key=value)
, 或Foo({key: value})
或Foo([(key, value)])
。
对于这种情况,所有标准 Python 实现都附带了现有的测试。CPython 带有一个非常广泛的测试套件,其中包括test_dict.py
. PyPy 运行所有(Python 级别的)CPython 测试,以及一些额外的测试。
您显然必须修改这些测试以在任意类上运行,而不是硬编码到测试中,并且您可能还必须修改它们以处理您选择的任何定义。另外,他们的测试可能比您要求的要多。你只想知道一个类是否符合协议,而不是它的方法是否做正确的事,对吧?但是,我仍然认为它们是一个很好的起点。
最后,C API 定义了一个具体对象层,尽管它不具有权威性,但与之前的定义相匹配,并且定义更加严格。
不幸的是,这个测试对你来说肯定不是很有用,因为它们正在检查诸如是否PyDict_Check
和PyDict_GetItem
在你的类上工作之类的东西,它们不会用于纯 Python 中定义的任何映射。
如果您确实为这些定义中的任何一个构建了完整的东西,我强烈建议将其放在 PyPI 上,并将其发布到 python-list,以便您获得反馈(和错误报告)。