在尝试将一些Python/C代码转换为在2和3中工作时,我发现,考虑到下面的Python
DICT = { … }
class Example(object):
ITEMS = DICT.values()
然后调用PyObject_GetAttrString(an_example, "ITEMS")
将产生一个PySequence_Check
在2.7中返回true的PyObject
。现在,在3.4中,它生成了一个PyObject
,它的类型是PyDictValues_Type
,而PySequence_Check
不返回true。关于PyDictValues
的文档是稀疏的。一个人能用它做什么?它还对PyIter_Check
响应为false。
发布于 2016-10-12 10:21:21
在Python2中,dict.values()
返回一个列表,但在Python3中,它是字典值的视图。Python2.7中的等价物是dict.viewvalues()
。
特别地,视图不是序列,因为字典没有命令。所以dict.viewkeys()
和dict.viewitems()
是设置类似的,因为键必须是唯一的。dict.viewvalues()
是多集式的.您可以对其进行迭代,获取长度,并对其进行包含检查。但你不能像序列一样索引它。
发布于 2016-10-12 10:20:36
基本上就是iter
(C中的PyObject_GetIter
)。
从技术上讲,还有其他操作,如==
(从object
继承而来,无趣)、len
(但如果需要,您可以在dict上调用它而不是创建值视图)和in
(慢速线性扫描,避免它),但值视图的主要用途是可迭代的。
如果您想要一个像Python2这样的列表,那么在dict上使用call调用PyDict_Values
而不是调用values
方法仍然会生成一个列表。
键和项视图(keys()
和items()
)更有趣。它们支持collections.abc.Set
接口中的所有操作,您可以通过这些操作的通常的C等价物来访问这些操作(比如PyObject_RichCompare
或PySequence_Contains
,尽管它们不是序列)。
https://stackoverflow.com/questions/40005285
复制