Dictionary Objects

  • PyDictObject

    • PyObject的此子类型表示 Python 字典对象。
  • PyTypeObject PyDict_Type

    • PyTypeObject的此实例表示 Python 字典类型。该对象与 Python 层中的dict相同。
  • int PyDict_Check(PyObject ** p *)

    • 如果* p *是 dict 对象或 dict 类型的子类型的实例,则返回 true。
  • int PyDict_CheckExact(PyObject ** p *)

    • 如果* p *是 dict 对象,但不是 dict 类型的子类型的实例,则返回 true。
  • PyObject* PyDict_New ( )

    • 返回值:新参考.

返回一个新的空字典,如果失败则返回NULL

返回一个types.MappingProxyType对象,以执行强制只读行为的 Map。这通常用于创建视图,以防止修改非动态类类型的字典。

  • 无效PyDict_Clear(PyObject ** p *)

    • 清空所有键值对的现有字典。
  • int PyDict_Contains(PyObject *p PyObject key *)

    • 确定字典* p 是否包含 key 。如果 p 中的项与 key *相匹配,则返回1,否则返回0。出错时,返回-1。这等效于 Python 表达式key in p
  • PyObject * PyDict_Copy(PyObject ** p *)

    • 返回值:新参考.

返回一个新字典,该字典包含与* p *相同的键值对。

  • int PyDict_SetItem(PyObject *p PyObject key *,PyObject ** val *)

    • 用* key 键将 val 插入字典 p 中。 必须为hashable;如果不是,则会引发TypeError。如果成功则返回0,如果失败则返回-1。该Function不会窃取 val *的引用。
  • int PyDict_SetItemString(PyObject *p ,const char key *,PyObject ** val *)

    • 使用* key 作为键,将 val 插入字典 p 中。 * key 应该是const char*。关键对象是使用PyUnicode_FromString(key)创建的。如果成功则返回0,如果失败则返回-1。该Function不会窃取* val *的引用。
  • int PyDict_DelItem(PyObject *p PyObject key *)

    • 使用键* key 删除字典 p *中的条目。 必须是可哈希的;如果不是,则引发TypeError。成功返回0,失败返回-1
  • int PyDict_DelItemString(PyObject *p ,const char key *)

    • 删除字典* p 中的条目,该条目具有由字符串 key *指定的键。成功返回0或失败返回-1
  • PyObject * PyDict_GetItem(PyObject p PyObject 密钥)

    • *返回值:借用参考。

从具有键* key 的字典 p 返回对象。如果键 key 不存在,但没有*设置异常,则返回NULL

请注意,调用hash()eq()方法时发生的异常将被抑制。要获取错误报告,请改用PyDict_GetItemWithError()

PyDict_GetItem()的变体,不抑制异常。如果发生异常,则返回NULL with 一个异常集。如果不存在该键,则返回NULL 没有 异常。

  • PyObject * PyDict_GetItemString(PyObject *p ,const char key *)
    • *返回值:借用参考。

这与PyDict_GetItem()相同,但是* key *被指定为const char*而不是PyObject*

请注意,在调用hash()eq()方法并创建临时字符串对象时发生的异常将被抑制。要获取错误报告,请改用PyDict_GetItemWithError()

这与 Python 级别dict.setdefault()相同。如果存在,它将从字典* p 返回与 key 相对应的值。如果键不在字典中,则将其插入值 defaultobj 并返回 defaultobj 。该函数仅对 key *的哈希函数进行一次评估,而不是针对查找和插入对其进行独立评估。

3.4 版的新Function。

返回一个PyListObject,其中包含字典中的所有项目。

返回包含字典中所有键的PyListObject

返回包含字典* p *中所有值的PyListObject

  • Py_ssize_t PyDict_Size(PyObject ** p *)
    • 返回字典中的项目数。这相当于字典上的len(p)
  • int PyDict_Next(PyObject *p ,Py_ssize_t ppos PyObject *** pkey PyObject * pvalue *)
    • 遍历字典* p *中的所有键值对。 * ppos 所引用的Py_ssize_t必须在第一次调用此函数开始迭代之前初始化为0;该函数对字典中的每对返回 true,一旦报告所有对,则返回 false。参数 pkey pvalue *要么指向将分别用每个键和值填充的PyObject*变量,要么可以是NULL。pass它们返回的所有引用都是借用的。 * ppos *不应在迭代过程中更改。它的值表示内部字典结构中的偏移量,并且由于结构稀疏,因此偏移量不是连续的。

For example:

PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    /* do something interesting with the values... */
    ...
}

字典* p *不应在迭代过程中发生突变。遍历字典时,可以安全地修改键的值,但前提是只要键的集合不发生变化即可。例如:

PyObject *key, *value;
Py_ssize_t pos = 0;

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    long i = PyLong_AsLong(value);
    if (i == -1 && PyErr_Occurred()) {
        return -1;
    }
    PyObject *o = PyLong_FromLong(i + 1);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) {
        Py_DECREF(o);
        return -1;
    }
    Py_DECREF(o);
}
  • int PyDict_Merge(PyObject *a PyObject b *,int * override *)

    • 遍历 Map 对象* b ,将键值对添加到字典 a *。 * b 可以是字典,也可以是任何支持PyMapping_Keys()PyObject_GetItem()的对象。如果 override 为 true,则在 b 中找到匹配键时,将替换 a 中的现有对,否则,仅在 a *中没有匹配键时才添加对。成功返回0,如果引发异常则返回-1
  • 整数PyDict_Update(PyObject *a PyObject b *)

    • 这与 C 语言中的PyDict_Merge(a, b, 1)相同,并且与 Python 中的a.update(b)相似,不同之处在于,如果第二个参数没有“ keys”属性,则PyDict_Update()不会回退到一系列键值对上。成功返回0,如果引发异常则返回-1
  • int PyDict_MergeFromSeq2(PyObject *a PyObject seq2 *,int * override *)

    • 从* seq2 中的键值对更新或合并到字典 a *中。 * seq2 必须是可迭代对象,它产生长度为 2 的可迭代对象,被视为键值对。在重复键的情况下,如果 override *为 true,则最后一个获胜,否则,第一个获胜。成功返回0,如果引发异常则返回-1。等效的 Python(返回值除外):
def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value
  • int PyDict_ClearFreeList()
    • 清除空闲列表。返回释放的项目总数。

版本 3.3 中的新Function。