你可以用 PyDictValues_Type 做什么?
What can you do with a PyDictValues_Type?
在尝试将一些 Python/C API 代码转换为在 2 和 3 中工作时,我发现,给定以下 Python
DICT = { … }
class Example(object):
ITEMS = DICT.values()
然后调用 PyObject_GetAttrString(an_example, "ITEMS")
会产生一个 PyObject
,而 PySequence_Check
在 2.7 中会 return 为真。现在在 3.4 中,它产生一个 PyObject
类型是 PyDictValues_Type
而 PySequence_Check
不是 return true。 PyDictValues
上的文档很稀疏。人们可以用它做什么?它还对 PyIter_Check
.
响应错误
基本上就iter
(CAPI中的PyObject_GetIter
)。
技术上还有其他操作,例如 ==
(继承自 object
,无趣),len
(但您会在 dict 上调用它而不是创建值视图如果你想要的话)和in
(缓慢的线性扫描,避免它),但是值视图的主要用途是作为一个可迭代的。
如果你想要一个列表,比如 Python 2,使用 C API 在 dict 上调用 PyDict_Values
而不是调用 values
方法仍然会生成一个列表.
键和项目视图(keys()
和 items()
)更有趣。它们支持 collections.abc.Set
接口中的所有操作,您可以通过这些操作的常用 C API 等价物访问这些操作(例如 PyObject_RichCompare
或 PySequence_Contains
,即使它们不是序列)。
在Python2中,dict.values()
returns一个列表,但在Python3中,它是一个字典值的视图。 Python 2.7 中的等价物是 dict.viewvalues()
.
特别是视图不是序列,因为字典没有顺序。所以 dict.viewkeys()
和 dict.viewitems()
是类似集合的,因为键必须是唯一的。 dict.viewvalues()
类似于多集。您可以遍历它,获取长度,并对其进行包含检查。但是你不能像序列一样对它进行索引。
在尝试将一些 Python/C API 代码转换为在 2 和 3 中工作时,我发现,给定以下 Python
DICT = { … }
class Example(object):
ITEMS = DICT.values()
然后调用 PyObject_GetAttrString(an_example, "ITEMS")
会产生一个 PyObject
,而 PySequence_Check
在 2.7 中会 return 为真。现在在 3.4 中,它产生一个 PyObject
类型是 PyDictValues_Type
而 PySequence_Check
不是 return true。 PyDictValues
上的文档很稀疏。人们可以用它做什么?它还对 PyIter_Check
.
基本上就iter
(CAPI中的PyObject_GetIter
)。
技术上还有其他操作,例如 ==
(继承自 object
,无趣),len
(但您会在 dict 上调用它而不是创建值视图如果你想要的话)和in
(缓慢的线性扫描,避免它),但是值视图的主要用途是作为一个可迭代的。
如果你想要一个列表,比如 Python 2,使用 C API 在 dict 上调用 PyDict_Values
而不是调用 values
方法仍然会生成一个列表.
键和项目视图(keys()
和 items()
)更有趣。它们支持 collections.abc.Set
接口中的所有操作,您可以通过这些操作的常用 C API 等价物访问这些操作(例如 PyObject_RichCompare
或 PySequence_Contains
,即使它们不是序列)。
在Python2中,dict.values()
returns一个列表,但在Python3中,它是一个字典值的视图。 Python 2.7 中的等价物是 dict.viewvalues()
.
特别是视图不是序列,因为字典没有顺序。所以 dict.viewkeys()
和 dict.viewitems()
是类似集合的,因为键必须是唯一的。 dict.viewvalues()
类似于多集。您可以遍历它,获取长度,并对其进行包含检查。但是你不能像序列一样对它进行索引。