Python 使用PyDictU类型可以做什么?
在尝试将一些Python/CAPI代码转换为在2和3中都能工作时,我发现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不会返
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值对象。