尝试将一些Python / C API代码转换为2& 3,我发现,给出以下Python
DICT = { … }
class Example(object):
ITEMS = DICT.values()
然后调用PyObject_GetAttrString(an_example, "ITEMS")
会产生PyObject
,PySequence_Check
将在2.7中返回true。现在在3.4中,它产生PyObject
,其类型为PyDictValues_Type
,PySequence_Check
不返回true。关于PyDictValues
的文件很简陋。人们可以用它做什么?它也对PyIter_Check
做出错误回应。
答案 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_RichCompare
或PySequence_Contains
,即使它们是&# 39;不是序列)。
答案 1 :(得分:1)
在Python 2中,dict.values()
返回一个列表,但在Python 3中,它是字典值的视图。 Python 2.7中的等价物是dict.viewvalues()
。
特别是视图不是序列,因为词典没有订单。因此dict.viewkeys()
和dict.viewitems()
是一样的,因为键必须是唯一的。 dict.viewvalues()
是多集的。您可以迭代它,获取长度,并对其进行包含检查。但你不能像序列一样索引它。