【问题标题】:Python collections ValuesView abc: why doesn't it inherit from Iterable?Python集合ValuesView abc:为什么它不继承自Iterable?
【发布时间】:2016-10-13 12:25:53
【问题描述】:

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

this 是源(Python 2,但在 Python 3 中也是如此)

我对@9​​87654326@ 界面感到非常困惑,因为从一个 它应该从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。其他ABCs,如SequenceSet,明确为Iterable。这背后是否有一些神秘的原因,或者它只是一个很少使用的功能的文档+实现缺陷?

【问题讨论】:

    标签: python collections abc


    【解决方案1】:

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

    【讨论】:

    • bugs.python.org/issue32467 “我会继续这样做,因为它确实提供了一种整洁的感觉(与 KeysView 和 ItemsView 相比)并且它可能会避免在某个地方出现迂腐的 StackOverflow 问题。” -> 实际上,这个问题已经被问过了 :-)
    猜你喜欢
    • 2021-05-16
    • 2015-05-02
    • 2015-06-27
    • 2019-09-24
    • 1970-01-01
    • 2023-04-07
    • 2018-03-12
    • 2020-12-16
    • 2020-12-13
    相关资源
    最近更新 更多