Python 使用PyDictU类型可以做什么?

Python 使用PyDictU类型可以做什么?,python,python-2.7,python-3.4,python-c-api,Python,Python 2.7,Python 3.4,Python C Api,在尝试将一些Python/CAPI代码转换为在2和3中都能工作时,我发现 DICT = { … } class Example(object): ITEMS = DICT.values() 然后调用PyObject\u GetAttrString(例如,“ITEMS”)将生成一个PyObject,其PySequence\u检查将在2.7中返回true。现在在3.4中,它将生成一个类型为PyDictValues\u type的PyObject,并且PySequence\u Check不会返

在尝试将一些Python/CAPI代码转换为在2和3中都能工作时,我发现

DICT = { … }

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

然后调用
PyObject\u GetAttrString(例如,“ITEMS”)
将生成一个
PyObject
,其
PySequence\u检查将在2.7中返回true。现在在3.4中,它将生成一个类型为
PyDictValues\u type
PyObject
,并且
PySequence\u Check
不会返回true。关于
PyDictValues
的文档非常稀疏。你能用它做什么?它对
PyIter\u Check
的响应也为false,基本上就是
iter
PyObject\u GetIter
,在C API中)

技术上还有其他操作,如
==
(继承自
对象,无趣),
len
(但如果需要,您可以在dict上调用它,而不是创建值视图),以及
中的
(慢速线性扫描,避免),但值视图的主要用途是作为iterable

如果您想要一个列表,比如Python2,使用dict上的C API调用
PyDict\u Values
而不是调用
Values
方法仍然可以生成一个列表


键和项视图(
Keys()
items()
)更有趣。它们支持接口中的所有操作,您可以通过这些操作的常见C API等价物访问这些操作(因此像
PyObject\u RichCompare
PySequence\u这样的东西包含
,即使它们不是序列)。

在Python2中,
dict.values()
返回一个列表,但在Python3中,这是字典值的视图。Python2.7中的等价物是


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

在我的例子中,iter是我所需要的全部,所以它的顶部对我有用<返回的对象上的code>PyDict_值
@NathanHerring:
PyDict_值
接受dict,而不是dict值对象。