我只是在为我的一个项目检查ABC上的一些文档,我需要在其中做一些与类型相关的工作。这些是有关Python 2和3中ValuesView类型的官方文档。

https://docs.python.org/2/library/collections.html#collections.ValuesView
https://docs.python.org/3/library/collections.abc.html

这就是来源(Python 2,但在Python 3中也是如此)

https://hg.python.org/releases/2.7.11/file/9213c70c67d2/Lib/_abcoll.py#l479

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

因此,我启动了2.7解释器:

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

毕竟,由于Iterable自己的子类 Hook ,它看起来是可迭代的。

但是我不明白为什么ValuesView不是显式可迭代的。其他ABC,例如“序列”或“集合”,是显式可迭代的。这背后是否存在一些不可思议的原因,或者仅仅是使用文档和实现方面的缺陷,是一个很少使用的功能?

编辑:
从Python 3.7开始,ValuesView可以正常工作。似乎不过是疏忽而已。

最佳答案

在Python 3.7.2中,它同时继承自MappingView和集合,而继而继承自和其他可迭代的。有人听了你的话。

10-07 13:30
查看更多