字典对象

type PyDictObject

这种subtype PyObject 表示Python字典对象。

PyTypeObject PyDict_Type

此实例 PyTypeObject 表示python字典类型。这是同一个对象 dict 在python层中。

int PyDict_Check(PyObject *p)

如果满足以下条件,则返回TRUE p 是DICT对象或DICT类型的子类型的实例。此功能总是成功的。

int PyDict_CheckExact(PyObject *p)

如果满足以下条件,则返回TRUE p 是DICT对象,但不是DICT类型的子类型的实例。此功能总是成功的。

PyObject *PyDict_New()
Return value: New reference.

返回新的空字典,或 NULL 失败论。

PyObject *PyDictProxy_New(PyObject *mapping)
Return value: New reference.

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

void 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)
Return value: New reference.

返回一个新字典,该字典包含与 p .

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

插入 val 进入字典 p 用钥匙 key . key 必须是 hashable 如果不是, TypeError 将被提升。返回 0 关于成功还是 -1 失败时。这个函数 窃取对的引用 val .

int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)

插入 val 进入字典 p 使用 key 作为一把钥匙。 key 应该是 const char* . 键对象是使用 PyUnicode_FromString(key) . 返回 0 关于成功还是 -1 失败时。这个函数 窃取对的引用 val .

int PyDict_DelItem(PyObject *p, PyObject *key)

删除字典中的条目 p 带钥匙 key . key 必须是可哈希的;如果不是, TypeError 提高了。如果 key 不在字典里, KeyError 提高了。返回 0 关于成功还是 -1 失败论。

int PyDict_DelItemString(PyObject *p, const char *key)

删除字典中的条目 p 其键由字符串指定 key .如果 key 不在字典里, KeyError 提高了。返回 0 关于成功还是 -1 失败论。

PyObject *PyDict_GetItem(PyObject *p, PyObject *key)
Return value: Borrowed reference.

从字典返回对象 p 它有一把钥匙 key . 返回 NULL 如果钥匙 key 不存在,但 没有 设置异常。

请注意,调用时发生的异常 __hash__()__eq__() 方法将被抑制。要获取错误报告,请使用 PyDict_GetItemWithError() 相反。

在 3.10 版更改: 在没有 GIL 因为历史原因被允许关押。这是不允许的。

PyObject *PyDict_GetItemWithError(PyObject *p, PyObject *key)
Return value: Borrowed reference.

Variant of PyDict_GetItem() that does not suppress exceptions. Return NULL with an exception set if an exception occurred. Return NULL without an exception set if the key wasn't present.

PyObject *PyDict_GetItemString(PyObject *p, const char *key)
Return value: Borrowed reference.

这和 PyDict_GetItem() ,但是 key 被指定为 const char* ,而不是 PyObject* .

请注意,调用时发生的异常 __hash__()__eq__() 方法和创建临时字符串对象将被禁止。要获取错误报告,请使用 PyDict_GetItemWithError() 相反。

PyObject *PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)
Return value: Borrowed reference.

这与python级别相同 dict.setdefault() . 如果存在,则返回对应于 key 从字典中 p . 如果密钥不在dict中,则插入值为 德布托德布托 返回。此函数计算的hash函数 key 只进行一次,而不是对其进行独立的查找和插入评估。

3.4 新版功能.

PyObject *PyDict_Items(PyObject *p)
Return value: New reference.

返回A PyListObject 包含字典中的所有项。

PyObject *PyDict_Keys(PyObject *p)
Return value: New reference.

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

PyObject *PyDict_Values(PyObject *p)
Return value: New reference.

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

Py_ssize_t PyDict_Size(PyObject *p)

返回字典中的项数。这相当于 len(p) 在字典上。

int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)

迭代字典中的所有键值对 p . 这个 Py_ssize_t 引用人 ppos 必须初始化为 0 在第一次调用此函数以开始迭代之前,函数将为字典中的每对返回true,并在报告了所有对之后返回false。参数 pkey价值观 应该指向 PyObject* 将分别用每个键和值填充的变量,或者 NULL . 通过它们返回的任何引用都是借用的。 ppos 不应该在迭代期间更改。它的值表示内部字典结构中的偏移量,由于该结构是稀疏的,因此偏移量不是连续的。

例如::

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)

迭代映射对象 b 向字典中添加键值对 a . b 可能是字典或任何支持的对象 PyMapping_Keys()PyObject_GetItem() .如果 覆盖 是真的,现有对位于 a 如果在 b ,否则仅当中没有匹配的密钥时才会添加对。 a . 返回 0 关于成功还是 -1 如果引发异常。

int PyDict_Update(PyObject *a, PyObject *b)

这和 PyDict_Merge(a, b, 1) 在C中,并且类似于 a.update(b) 在 Python 中,除了 PyDict_Update() 如果第二个参数没有“keys”属性,则不会返回到对键-值序列的迭代。返回 0 关于成功还是 -1 如果引发异常。

int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)

更新或合并到词典 a ,从中的键值对 seq2 . seq2 必须是可Iterable对象,生成长度为2的可Iterable对象,视为键值对。如果钥匙重复,最后一个赢如果 覆盖 是真的,否则第一个赢。返回 0 关于成功还是 -1 如果引发异常。等效python(返回值除外)::

def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value