9

我只是在collections.abcs 上为我的一个项目查看一些文档,我需要在其中做一些与类型相关的工作。这些是ValuesViewPython 2 和 3 中关于类型的官方文档:

就是源代码(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自己的子类挂钩。

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

4

1 回答 1

5

在 Python 3.7.2 中,它继承自两者MappingView,而Collection后者又继承自 (以及其他) Iterable。有人听你的。

于 2019-01-21T14:21:14.640 回答