你可以用 PyDictValues_Type 做什么?

What can you do with a PyDictValues_Type?

在尝试将一些 Python/C API 代码转换为在 2 和 3 中工作时,我发现,给定以下 Python

DICT = { … }

class Example(object):
  ITEMS = DICT.values()

然后调用 PyObject_GetAttrString(an_example, "ITEMS") 会产生一个 PyObject ,而 PySequence_Check 在 2.7 中会 return 为真。现在在 3.4 中,它产生一个 PyObject 类型是 PyDictValues_TypePySequence_Check 不是 return true。 PyDictValues 上的文档很稀疏。人们可以用它做什么?它还对 PyIter_Check.

响应错误

基本上就iter(CAPI中的PyObject_GetIter)。

技术上还有其他操作,例如 ==(继承自 object,无趣),len(但您会在 dict 上调用它而不是创建值视图如果你想要的话)和in(缓慢的线性扫描,避免它),但是值视图的主要用途是作为一个可迭代的。

如果你想要一个列表,比如 Python 2,使用 C API 在 dict 上调用 PyDict_Values 而不是调用 values 方法仍然会生成一个列表.

键和项目视图(keys()items())更有趣。它们支持 collections.abc.Set 接口中的所有操作,您可以通过这些操作的常用 C API 等价物访问这些操作(例如 PyObject_RichComparePySequence_Contains,即使它们不是序列)。

在Python2中,dict.values()returns一个列表,但在Python3中,它是一个字典值的视图。 Python 2.7 中的等价物是 dict.viewvalues().

特别是视图不是序列,因为字典没有顺序。所以 dict.viewkeys()dict.viewitems() 是类似集合的,因为键必须是唯一的。 dict.viewvalues() 类似于多集。您可以遍历它,获取长度,并对其进行包含检查。但是你不能像序列一样对它进行索引。