Dictionary Objects

  • PyDictObject

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

    • PyTypeObject的此实例表示 Python 字典类型。这对于dicttypes.DictType暴露给 Python 程序。
  • int PyDict_Check(PyObject ** p *)
    • 如果* p *是 dict 对象或 dict 类型的子类型的实例,则返回 true。

在版本 2.2 中更改:接受允许的子类型。

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

2.4 版的新Function。

  • PyObject* PyDict_New ( )
    • 返回值:新参考.

返回一个新的空字典,否则返回* NULL *。

返回强制执行只读行为的 Map 的代理对象。这通常用于创建代理,以防止修改非动态类类型的字典。

2.2 版中的新Function。

  • 无效PyDict_Clear(PyObject ** p *)

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

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

2.4 版的新Function。

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

1.6 版中的新Function。

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

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

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

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

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

    • *返回值:借用参考。

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

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

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

返回一个包含字典中所有项目的PyListObject,如字典方法dict.items()一样。

与字典方法dict.keys()一样,返回包含字典中所有键的PyListObject

与字典方法dict.values()一样,返回包含字典* p *中所有值的PyListObject

  • Py_ssize_t PyDict_Size(PyObject ** p *)
    • 返回字典中的项目数。这相当于字典上的len(p)

在版本 2.5 中进行了更改:此函数返回了int类型。这可能需要更改您的代码以正确支持 64 位系统。

  • 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 *不应在迭代过程中发生突变。在字典上迭代时修改键的值是安全的(自 Python 2.1 起),但前提是只要键的集合不变即可。例如:

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

while (PyDict_Next(self->dict, &pos, &key, &value)) {
    int i = PyInt_AS_LONG(value) + 1;
    PyObject *o = PyInt_FromLong(i);
    if (o == NULL)
        return -1;
    if (PyDict_SetItem(self->dict, key, o) < 0) {
        Py_DECREF(o);
        return -1;
    }
    Py_DECREF(o);
}

在版本 2.5 中更改:此函数对* ppos *使用了int *类型。这可能需要更改您的代码以正确支持 64 位系统。

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

2.2 版中的新Function。

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

2.2 版中的新Function。

  • 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

2.2 版中的新Function。