首先,“标准的 Python 数据结构接口”不是列表、集合、字典、队列等。它们是接口的具体实现。 (队列甚至不是您所想的那种数据结构——它的显着特点是它的操作是原子的,put 和get 可以选择在Condition 上同步,等等。)
无论如何,接口以五种不同的不太兼容的方式定义。
文档的Built-in Types 部分描述了迭代器类型、序列类型等的含义。但是,这些并不像您对参考文档所期望的那样严格(至少如果您是过去,比如 C++ 或 Java)。
我不知道对这种东西有任何测试,所以我认为你必须从头开始构建它们。
collections 模块包含定义接口的Collections Abstract Base Classes,并提供了一种通过abc module 注册“虚拟子类”的方法。因此,您可以通过从collections.Mapping 继承或调用collections.Mapping.register 来声明“我是一个映射”。但这实际上并不能证明您是一个映射,只是您声称自己是一个映射。 (如果你继承自Mapping,它也可以作为一个mixin,通过在__getitem__之上实现例如__contains__来帮助你完成接口。)
如果你想测试ABC的意思,defuz的答案非常接近,我认为他或其他人可以再多做一点工作。
CPython C API 定义了一个Abstract Objects Layer。虽然这实际上并不是该语言的权威,但显然 C-API 协议和语言级接口应该匹配。而且,与后者不同的是,前者是严格定义的。当然,来自CPython 2.7 的源代码,也许还有像PyPy 这样的其他实现,可能会有所帮助。
CPython 附带了一些测试,但实际上,它们用于测试从 C 调用 PyMapping_GetItem 在 Python 中正确调用你的 mymapping.__getitem__,这实际上与你想要测试的内容相切,所以我认为它不会有太大帮助。
实际的具体类在协议之上还有额外的接口,您可能想对其进行测试,但这很难描述。特别是,__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 定义了一个Concrete Objects Layer,虽然它不具有权威性,但与之前的定义相匹配并且定义更严格。
不幸的是,这个测试肯定对你没有多大用处,因为他们正在检查诸如 PyDict_Check 和 PyDict_GetItem 是否在你的班级上工作,他们不会用于纯 Python 中定义的任何映射。
如果您确实为这些定义中的任何一个构建了完整的东西,我强烈建议将其放在 PyPI 上,并将其发布到 python-list,以便您获得反馈(和错误报告)。