我只是在为我的一个项目检查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和集合,而继而继承自和其他可迭代的。有人听了你的话。