Содержание страницы
Объекты словарей¶Dictionary Objects
-
PyTypeObject PyDict_Type¶
- Часть 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()¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает новый пустой словарь или
NULLв случае ошибки.
-
PyObject *PyDictProxy_New(PyObject *mapping)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает объект
types.MappingProxyTypeдля отображения, которое принудительно обеспечивает режим только для чтения. Обычно используется для создания представления, предотвращающего изменение словаря для нединамических типов классов.
-
PyTypeObject PyDictProxy_Type¶
- Часть Stable ABI.
Объект типа для прокси-объектов отображения, создаваемых
PyDictProxy_New(), и для атрибута__dict__только для чтения многих встроенных типов. ЭкземплярPyDictProxy_Typeпредоставляет динамическое представление только для чтения базового словаря: изменения в базовом словаре отражаются в прокси, но сам прокси не поддерживает операции изменения. Это соответствуетtypes.MappingProxyTypeв Python.
-
void PyDict_Clear(PyObject *p)¶
- Часть Stable ABI.
Очищает существующий словарь от всех пар ключ-значение.
-
int PyDict_Contains(PyObject *p, PyObject *key)¶
- Часть Stable ABI.
Определяет, содержит ли словарь p ключ key. Если элемент в p соответствует key, возвращает
1, в противном случае возвращает0. В случае ошибки возвращает-1. Это эквивалентно выражению Pythonkey in p.
-
int PyDict_ContainsString(PyObject *p, const char *key)¶
Это то же самое, что и
PyDict_Contains(), но key задается как const char* строка байтов в кодировке UTF-8, а не PyObject*.Добавлено в версии 3.13.
-
PyObject *PyDict_Copy(PyObject *p)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает новый словарь, содержащий те же пары ключ-значение, что и p.
-
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val)¶
- Часть Stable ABI.
Вставляет val в словарь p с ключом key. key должен быть хэшируемым; если нет, будет возбуждено
TypeError. Возвращает0при успехе или-1при неудаче. Эта функция не «похищает» ссылку на val.
-
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)¶
- Часть Stable ABI.
То же, что и
PyDict_SetItem(), но key задаётся как const char* строка байтов в кодировке UTF-8, а не как PyObject*.
-
int PyDict_DelItem(PyObject *p, PyObject *key)¶
- Часть Stable ABI.
Удаляет запись из словаря p с ключом key. key должен быть хэшируемым; если нет, возбуждается
TypeError. Если key отсутствует в словаре, возбуждаетсяKeyError. Возвращает0при успехе или-1при неудаче.
-
int PyDict_DelItemString(PyObject *p, const char *key)¶
- Часть Stable ABI.
То же, что и
PyDict_DelItem(), но key задаётся как const char* строка байтов в кодировке UTF-8, а не как PyObject*.
-
int PyDict_GetItemRef(PyObject *p, PyObject *key, PyObject **result)¶
- Часть Stable ABI, начиная с версии 3.13.
Возвращает новую сильную ссылку на объект из словаря p, имеющий ключ key:
Если ключ присутствует, устанавливает *result в новую сильную ссылку на значение и возвращает
1.Если ключ отсутствует, устанавливает *result в
NULLи возвращает0.При ошибке возбуждает исключение, устанавливает *result в
NULLи возвращает-1.
Добавлено в версии 3.13.
См. также функцию
PyObject_GetItem().
-
PyObject *PyDict_GetItem(PyObject *p, PyObject *key)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Возвращает заимствованную ссылку на объект из словаря p, который имеет ключ key. Возвращает
NULL, если ключ key отсутствует без возбуждения исключения.Примечание
Исключения, возникающие при вызове методов
__hash__()и__eq__(), молча игнорируются. Вместо этого рекомендуется использовать функциюPyDict_GetItemWithError().Изменено в версии 3.10: Вызов этого API без удержания GIL ранее допускался по историческим причинам. Теперь это не допускается.
-
PyObject *PyDict_GetItemWithError(PyObject *p, PyObject *key)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Вариант
PyDict_GetItem(), который не подавляет исключения. ВозвращаетNULLс установленным исключением, если произошло исключение. ВозвращаетNULLбез установленного исключения, если ключ отсутствовал.
-
PyObject *PyDict_GetItemString(PyObject *p, const char *key)¶
- Возвращаемое значение: заимствованная ссылка. Часть Stable ABI.
Это то же самое, что и
PyDict_GetItem(), но key задается как const char* строка байтов в кодировке UTF-8, а не PyObject*.Примечание
Исключения, возникающие при вызове методов
__hash__()и__eq__()или при создании временного объектаstr, молча игнорируются. Вместо этого рекомендуется использовать функциюPyDict_GetItemWithError()с собственнымPyUnicode_FromString()key.
-
int PyDict_GetItemStringRef(PyObject *p, const char *key, PyObject **result)¶
- Часть Stable ABI, начиная с версии 3.13.
Аналогично
PyDict_GetItemRef(), но key задается как const char* строка байтов в кодировке UTF-8, а не PyObject*.Добавлено в версии 3.13.
-
PyObject *PyDict_SetDefault(PyObject *p, PyObject *key, PyObject *defaultobj)¶
- Возвращаемое значение: заимствованная ссылка.
Это то же самое, что и функция
dict.setdefault()на уровне Python. Если значение присутствует, она возвращает значение, соответствующее key, из словаря p. Если ключ отсутствует в словаре, он вставляется со значением defaultobj и возвращается defaultobj. Эта функция вычисляет хеш-функцию для key только один раз, вместо того чтобы вычислять её отдельно для поиска и вставки.Добавлено в версии 3.4.
-
int PyDict_SetDefaultRef(PyObject *p, PyObject *key, PyObject *default_value, PyObject **result)¶
Вставляет default_value в словарь p с ключом key, если ключ ещё отсутствует в словаре. Если result не равен
NULL, то *result устанавливается в сильную ссылку либо на default_value (если ключ отсутствовал), либо на существующее значение (если key уже присутствовал в словаре). Возвращает1, если ключ присутствовал и default_value не был вставлен, или0, если ключ отсутствовал и default_value был вставлен. При ошибке возвращает-1, устанавливает исключение и устанавливает*resultвNULL.Для ясности: если у вас есть сильная ссылка на default_value до вызова этой функции, то после её возврата у вас будет сильная ссылка как на default_value, так и на *result (если он не равен
NULL). Они могут ссылаться на один и тот же объект: в этом случае у вас будет две отдельные ссылки на него.Добавлено в версии 3.13.
-
int PyDict_Pop(PyObject *p, PyObject *key, PyObject **result)¶
Удаляет key из словаря p и при необходимости возвращает удалённое значение. Не вызывает
KeyError, если ключ отсутствует.Если ключ присутствует, устанавливает *result в новую ссылку на удалённое значение, если result не равен
NULL, и возвращает1.Если ключ отсутствует, устанавливает *result в
NULL, если result не равенNULL, и возвращает0.При ошибке вызывает исключение и возвращает
-1.
Аналогично
dict.pop(), но без значения по умолчанию и не вызываетKeyError, если ключ отсутствует.Добавлено в версии 3.13.
-
int PyDict_PopString(PyObject *p, const char *key, PyObject **result)¶
Аналогично
PyDict_Pop(), но key задается как const char* строка байтов в кодировке UTF-8, а не PyObject*.Добавлено в версии 3.13.
-
PyObject *PyDict_Items(PyObject *p)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает
PyListObject, содержащий все элементы из словаря.
-
PyObject *PyDict_Keys(PyObject *p)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает
PyListObject, содержащий все ключи из словаря.
-
PyObject *PyDict_Values(PyObject *p)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI.
Возвращает
PyListObject, содержащий все значения из словаря p.
-
Py_ssize_t PyDict_Size(PyObject *p)¶
- Часть Stable ABI.
Возвращает количество элементов в словаре. Это эквивалентно вызову
len(p)для словаря.
-
Py_ssize_t PyDict_GET_SIZE(PyObject *p)¶
Аналогично
PyDict_Size(), но без проверки ошибок.
-
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)¶
- Часть 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)) { /* сделайте что-нибудь интересное со значениями... */ ... }
Словарь 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); }
Функция не является потокобезопасной в сборке со свободными потоками без внешней синхронизации. Вы можете использовать
Py_BEGIN_CRITICAL_SECTIONдля блокировки словаря при итерации по нему:Py_BEGIN_CRITICAL_SECTION(self->dict); while (PyDict_Next(self->dict, &pos, &key, &value)) { ... } Py_END_CRITICAL_SECTION();
-
int PyDict_Merge(PyObject *a, PyObject *b, int override)¶
- Часть Stable ABI.
Перебирает объект отображения b, добавляя пары ключ-значение в словарь a. b может быть словарем или любым объектом, поддерживающим
PyMapping_Keys()иPyObject_GetItem(). Если override равно true, существующие пары в a будут заменены, если найден совпадающий ключ в b; в противном случае пары будут добавлены только если нет совпадающего ключа в a. Возвращает0при успехе или-1, если было возбуждено исключение.
-
int PyDict_Update(PyObject *a, PyObject *b)¶
- Часть 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)¶
- Часть 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
-
int PyDict_AddWatcher(PyDict_WatchCallback callback)¶
Регистрирует колбэк в качестве наблюдателя словаря. Возвращает неотрицательное целое id, которое должно передаваться в последующие вызовы
PyDict_Watch(). В случае ошибки (например, закончились идентификаторы наблюдателей) возвращает-1и устанавливает исключение.Добавлено в версии 3.12.
-
int PyDict_ClearWatcher(int watcher_id)¶
Удаляет наблюдателя, идентифицированного watcher_id, ранее возвращённого из
PyDict_AddWatcher(). Возвращает0при успехе,-1при ошибке (например, если указанный watcher_id никогда не был зарегистрирован).Добавлено в версии 3.12.
-
int PyDict_Watch(int watcher_id, PyObject *dict)¶
Помечает словарь dict как наблюдаемый. Колбэк, которому watcher_id был назначен
PyDict_AddWatcher(), будет вызываться при изменении или освобождении dict. Возвращает0при успехе или-1при ошибке.Добавлено в версии 3.12.
-
int PyDict_Unwatch(int watcher_id, PyObject *dict)¶
Помечает словарь dict как больше не наблюдаемый. Колбэк, которому watcher_id был назначен
PyDict_AddWatcher(), больше не будет вызываться при изменении или освобождении dict. Словарь ранее должен был быть наблюдаемым этим наблюдателем. Возвращает0при успехе или-1при ошибке.Добавлено в версии 3.12.
-
type PyDict_WatchEvent¶
Перечисление возможных событий наблюдателя словаря:
PyDict_EVENT_ADDED,PyDict_EVENT_MODIFIED,PyDict_EVENT_DELETED,PyDict_EVENT_CLONED,PyDict_EVENT_CLEARED, илиPyDict_EVENT_DEALLOCATED.Добавлено в версии 3.12.
-
typedef int (*PyDict_WatchCallback)(PyDict_WatchEvent event, PyObject *dict, PyObject *key, PyObject *new_value)¶
Тип функции колбэка наблюдателя словаря.
Если event равен
PyDict_EVENT_CLEAREDилиPyDict_EVENT_DEALLOCATED, то и key, и new_value будут равныNULL. Если event равенPyDict_EVENT_ADDEDилиPyDict_EVENT_MODIFIED, new_value будет новым значением для key. Если event равенPyDict_EVENT_DELETED, key удаляется из словаря, и new_value будет равенNULL.PyDict_EVENT_CLONEDпроисходит, когда dict ранее был пуст, и в него объединяется другой словарь. Для сохранения эффективности этой операции событияPyDict_EVENT_ADDEDдля каждого ключа в этом случае не выдаются; вместо этого выдаётся одноPyDict_EVENT_CLONED, и key будет исходным словарём.Колбэк может проверять, но не должен изменять dict; это может привести к непредсказуемым последствиям, включая бесконечную рекурсию. Не запускайте выполнение кода Python в колбэке, так как это может изменить словарь в качестве побочного эффекта.
Если event равен
PyDict_EVENT_DEALLOCATED, получение новой ссылки в колбэке на словарь, который будет уничтожен, воскресит его и предотвратит его освобождение в этот момент. Когда воскрешённый объект будет уничтожен позже, все активные на тот момент колбэки наблюдателей будут вызваны снова.Колбэки происходят до того, как происходит уведомляемое изменение dict, поэтому можно проверить предыдущее состояние dict.
Если обратный вызов устанавливает исключение, он должен вернуть
-1; это исключение будет выведено как неподнимаемое исключение с помощьюPyErr_WriteUnraisable(). В противном случае он должен вернуть0.На момент входа в обратный вызов уже может быть установлено отложенное исключение. В этом случае обратный вызов должен вернуть
0, оставив то же исключение установленным. Это означает, что обратный вызов не может вызывать никакой другой API, который может установить исключение, если только он сначала не сохранит и не очистит состояние исключения, а затем не восстановит его перед возвратом.Добавлено в версии 3.12.
Объекты представлений словаря¶Dictionary View Objects
-
int PyDictViewSet_Check(PyObject *op)¶
Возвращает истину, если op является представлением множества внутри словаря. В настоящее время это эквивалентно PyDictKeys_Check(op) || PyDictItems_Check(op). Эта функция всегда выполняется успешно.
-
PyTypeObject PyDictKeys_Type¶
- Часть Stable ABI.
Объект типа для представления ключей словаря. В Python это тип объекта, возвращаемого
dict.keys().
-
int PyDictKeys_Check(PyObject *op)¶
Возвращает истину, если op является экземпляром представления ключей словаря. Эта функция всегда выполняется успешно.
-
PyTypeObject PyDictValues_Type¶
- Часть Stable ABI.
Объект типа для представления значений словаря. В Python это тип объекта, возвращаемого
dict.values().
-
int PyDictValues_Check(PyObject *op)¶
Возвращает true, если op является экземпляром представления значений словаря. Эта функция всегда завершается успешно.
-
PyTypeObject PyDictItems_Type¶
- Часть Stable ABI.
Объект типа для представления элементов словаря. В Python это тип объекта, возвращаемого
dict.items().
Упорядоченные словари¶Ordered Dictionaries
C API Python предоставляет интерфейс для collections.OrderedDict из C.
Начиная с Python 3.7, словари упорядочены по умолчанию, поэтому обычно
нет особой необходимости в этих функциях; где возможно, предпочитайте PyDict*.
-
PyTypeObject PyODict_Type¶
Объект типа для упорядоченных словарей. Это тот же объект, что и
collections.OrderedDictна уровне Python.
-
int PyODict_Check(PyObject *od)¶
Возвращает true, если od является объектом упорядоченного словаря или экземпляром подтипа типа
OrderedDict. Эта функция всегда завершается успешно.
-
int PyODict_CheckExact(PyObject *od)¶
Возвращает true, если od является объектом упорядоченного словаря, но не экземпляром подтипа типа
OrderedDict. Эта функция всегда завершается успешно.
-
PyTypeObject PyODictKeys_Type¶
Аналог
PyDictKeys_Typeдля упорядоченных словарей.
-
PyTypeObject PyODictValues_Type¶
Аналог
PyDictValues_Typeдля упорядоченных словарей.
-
PyTypeObject PyODictItems_Type¶
Аналог
PyDictItems_Typeдля упорядоченных словарей.
-
PyObject *PyODict_New(void)¶
Возвращает новый пустой упорядоченный словарь или
NULLпри ошибке.Это аналог
PyDict_New().
-
int PyODict_SetItem(PyObject *od, PyObject *key, PyObject *value)¶
Вставляет значение value в упорядоченный словарь od с ключом key. Возвращает
0при успехе или-1с установленным исключением при ошибке.Это аналог
PyDict_SetItem().
-
int PyODict_DelItem(PyObject *od, PyObject *key)¶
Удаляет запись из упорядоченного словаря od с ключом key. Возвращает
0при успехе или-1с установленным исключением при ошибке.Это аналог
PyDict_DelItem().
Это мягко устаревшие псевдонимы для API PyDict:
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|