你可以用PyDictValues_Type做什么?

时间:2016-10-12 17:56:26

标签: python python-2.7 python-3.4 python-c-api

尝试将一些Python / C API代码转换为2& 3,我发现,给出以下Python

DICT = { … }

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

然后调用PyObject_GetAttrString(an_example, "ITEMS")会产生PyObjectPySequence_Check将在2.7中返回true。现在在3.4中,它产生PyObject,其类型为PyDictValues_TypePySequence_Check不返回true。关于PyDictValues的文件很简陋。人们可以用它做什么?它也对PyIter_Check做出错误回应。

2 个答案:

答案 0 :(得分:1)

基本上只是iter(C API中的PyObject_GetIter)。

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

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

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

答案 1 :(得分:1)

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

特别是视图不是序列,因为词典没有订单。因此dict.viewkeys()dict.viewitems()是一样的,因为键必须是唯一的。 dict.viewvalues()是多集的。您可以迭代它,获取长度,并对其进行包含检查。但你不能像序列一样索引它。