Словарные объекты

type PyDictObject

Этот подтип PyObject представляет объект словаря Python.

PyTypeObject PyDict_Type
Part of the Stable ABI.

Этот экземпляр 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. Part of the Stable ABI.

Возвращает новый пустой словарь, или NULL при неудаче.

PyObject *PyDictProxy_New(PyObject *mapping)
Return value: New reference. Part of the Stable ABI.

Возвращает объект types.MappingProxyType для отображения, которое обеспечивает поведение только для чтения. Обычно это используется для создания представления, чтобы предотвратить модификацию словаря для нединамических типов классов.

void PyDict_Clear(PyObject *p)
Part of the Stable ABI.

Очистить существующий словарь от всех пар ключ-значение.

int PyDict_Contains(PyObject *p, PyObject *key)
Part of the Stable ABI.

Определите, содержит ли словарь p ключ. Если элемент в p соответствует ключу, возвращается 1, иначе возвращается 0. При ошибке возвращается -1. Это эквивалентно выражению Python key in p.

PyObject *PyDict_Copy(PyObject *p)
Return value: New reference. Part of the Stable ABI.

Возвращает новый словарь, содержащий те же пары ключ-значение, что и p.

int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)
Part of the Stable ABI.

Вставить val в словарь p с ключом key. Ключ key должен быть hashable; если это не так, будет выдано сообщение TypeError. Возвращается 0 при успехе или -1 при неудаче. Эта функция не крадет ссылку на val.

int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
Part of the Stable ABI.

Вставьте val в словарь p, используя key в качестве ключа. Ключ должен быть объектом const char*. Объект ключа создается с помощью PyUnicode_FromString(key). Возвращается 0 при успехе или -1 при неудаче. Эта функция не крадет ссылку на val.

int PyDict_DelItem(PyObject *p, PyObject *key)
Part of the Stable ABI.

Удалить запись в словаре p с ключом key. Ключ key должен быть хэшируемым; если это не так, выдается сообщение TypeError. Если key отсутствует в словаре, выдается сообщение KeyError. Возвращается 0 при успехе или -1 при неудаче.

int PyDict_DelItemString(PyObject *p, const char *key)
Part of the Stable ABI.

Удалить запись в словаре p, которая имеет ключ, заданный строкой key. Если key отсутствует в словаре, выдается сообщение KeyError. Возвращается 0 при успехе или -1 при неудаче.

PyObject *PyDict_GetItem(PyObject *p, PyObject *key)
Return value: Borrowed reference. Part of the Stable ABI.

Возвращает объект из словаря p, который имеет ключ key. Вернуть NULL, если ключ key отсутствует, но без установки исключения.

Обратите внимание, что исключения, возникающие при вызове методов __hash__() и __eq__(), будут подавлены. Для получения сообщений об ошибках используйте PyDict_GetItemWithError() вместо этого.

Изменено в версии 3.10: Вызов этого API без удержания GIL был разрешен по историческим причинам. Теперь это больше не разрешено.

PyObject *PyDict_GetItemWithError(PyObject *p, PyObject *key)
Return value: Borrowed reference. Part of the Stable ABI.

Вариант PyDict_GetItem(), который не подавляет исключения. Возвращает NULL с установленным исключением, если произошло исключение. Возвращает NULL без установленного исключения, если ключ не присутствует.

PyObject *PyDict_GetItemString(PyObject *p, const char *key)
Return value: Borrowed reference. Part of the Stable ABI.

Это то же самое, что и PyDict_GetItem(), но ключ указывается как const char*, а не как PyObject*.

Обратите внимание, что исключения, возникающие при вызове методов __hash__() и __eq__() и создании временного строкового объекта, будут подавлены. Для получения сообщений об ошибках используйте PyDict_GetItemWithError() вместо этого.

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

Это то же самое, что и dict.setdefault() на уровне Python. Если присутствует, то возвращается значение, соответствующее key из словаря p. Если ключа нет в dict, он вставляется со значением defaultobj и возвращается defaultobj. Эта функция оценивает хэш-функцию key только один раз, вместо того, чтобы оценивать ее независимо для поиска и вставки.

Добавлено в версии 3.4.

PyObject *PyDict_Items(PyObject *p)
Return value: New reference. Part of the Stable ABI.

Возвращает PyListObject, содержащий все элементы из словаря.

PyObject *PyDict_Keys(PyObject *p)
Return value: New reference. Part of the Stable ABI.

Возвращает PyListObject, содержащий все ключи из словаря.

PyObject *PyDict_Values(PyObject *p)
Return value: New reference. Part of the Stable ABI.

Возвращает PyListObject, содержащий все значения из словаря p.

Py_ssize_t PyDict_Size(PyObject *p)
Part of the Stable ABI.

Возвращает количество элементов в словаре. Это эквивалентно len(p) в словаре.

int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
Part of the Stable ABI.

Итерация по всем парам ключ-значение в словаре p. Переменная Py_ssize_t, на которую ссылается ppos, должна быть инициализирована в 0 до первого вызова этой функции, чтобы начать итерацию; функция возвращает true для каждой пары в словаре и false, когда все пары будут перебраны. Параметры pkey и pvalue должны либо указывать на переменные 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)
Part of the Stable ABI.

Итерация над объектом отображения b, добавляя пары ключ-значение в словарь a. b может быть словарем или любым объектом, поддерживающим PyMapping_Keys() и PyObject_GetItem(). Если override равно true, существующие пары в a будут заменены, если в b будет найден подходящий ключ, в противном случае пары будут добавлены, только если в a нет подходящего ключа. Возвращает 0 при успехе или -1, если возникло исключение.

int PyDict_Update(PyObject *a, PyObject *b)
Part of the Stable ABI.

Это то же самое, что PyDict_Merge(a, b, 1) в C, и похоже на a.update(b) в Python, за исключением того, что PyDict_Update() не возвращается к итерации по последовательности пар ключ-значение, если второй аргумент не имеет атрибута «keys». Возвращает 0 при успехе или -1, если возникло исключение.

int PyDict_MergeFromSeq2(PyObject *a, PyObject *seq2, int override)
Part of the Stable ABI.

Обновление или объединение в словарь a, из пар ключ-значение в seq2. seq2 должен быть итерируемым объектом, производящим итерируемые объекты длины 2, рассматриваемые как пары ключ-значение. В случае дублирования ключей побеждает последний, если override истинно, иначе побеждает первый. Возвращает 0 при успехе или -1, если возникло исключение. Эквивалент Python (за исключением возвращаемого значения):

def PyDict_MergeFromSeq2(a, seq2, override):
    for key, value in seq2:
        if override or key not in a:
            a[key] = value
Вернуться на верх