Python collections ValuesView abc:为什么不继承自Iterable?

Python collections ValuesView abc: why doesn't it inherit from Iterable?

我只是在 Python 2 和 3 中检查了一些关于 collections.abcs for a project of mine, where I need to do some type-related work. Those are the official docs about the ValuesView 类型的文档:

this 是来源(Python 2,但同样发生在 Python 3)

我对 ValuesView 界面感到非常困惑,因为来自 它应该从 Iterable 继承的逻辑观点,恕我直言(它甚至 得到 __iter__ Mixin 方法);相反,文档说它只是 继承自 MappingView,后者继承自 Sized,后者不 继承自 Iterable.

所以我启动了我的 2.7 解释器:

>>> from collections import Iterable
>>> d = {1:2, 3:4}
>>> isinstance(d.viewvalues(), Iterable) 
True
>>>

看起来Iterable,毕竟是因为Iterable自己的subclasshook。

但我不明白为什么 ValuesView 没有明确地 Iterable。其他 ABC,如 SequenceSet,明确为 Iterable。这背后是否有一些神秘的原因,或者它只是一个很少使用的功能的文档+实现缺陷?

在 Python 3.7.2 中,它继承自 MappingViewCollection,后者又继承自(除其他外)Iterable。有人听你说话。