Объекты множества

В этом разделе подробно описывается открытое API для объектов set и frozenset. К любой функциональности, не упомянутой ниже, лучше всего получить доступ, используя любой абстрактный протокол объекта (включая PyObject_CallMethod(), PyObject_RichCompareBool(), PyObject_Hash(), PyObject_Repr(), PyObject_IsTrue(), PyObject_Print() и PyObject_GetIter()) или протокол абстрактного числа (включая PyNumber_And(), PyNumber_Subtract(), PyNumber_Or(), PyNumber_Xor(), PyNumber_InPlaceAnd(), PyNumber_InPlaceSubtract(), PyNumber_InPlaceOr() и PyNumber_InPlaceXor()).

PySetObject

Подтип PyObject используется для хранения внутренних данных как для set, так и для frozenset объектов. Похож на PyDictObject в том, что он фиксированного размера для небольших множеств (во многом похожий на хранение кортежей) и указывает на отдельный блок памяти переменного размера для множеств среднего и большого размера (во многом похожий на хранение списков). Ни одно из полей этой структуры следует считать открытыми и подлежащими изменению. Весь доступ должен осуществляться через документированный API, а не путем манипулирования значениями в структуре.

PyTypeObject PySet_Type

Сущность PyTypeObject, представляющая Python тип set.

PyTypeObject PyFrozenSet_Type

Сущность PyTypeObject, представляющее Python тип frozenset.

Макросы проверки следующего типа работают с указателями на любой объект Python. Аналогично, функции конструктора работают с любыми итерируемыми объектами Python.

int PySet_Check(PyObject *p)

Возвращает true, если p является объектом set или сущностью подтипа.

int PyFrozenSet_Check(PyObject *p)

Возвращает true, если p является объектом frozenset или сущностью подтипа.

int PyAnySet_Check(PyObject *p)

Возвращает true, если p является объектом set, объектом frozenset или сущностью подтипа.

int PyAnySet_CheckExact(PyObject *p)

Возвращает true, если p является объектом set или объектом frozenset, но не сущностью подтипа.

int PyFrozenSet_CheckExact(PyObject *p)

Возвращает true, если p является frozenset объектом, но не сущность подтипа.

PyObject* PySet_New(PyObject *iterable)
Return value: New reference.

Возвращает новое set, содержащее объекты, возвращенный iterable. Возможно, iterable может быть NULL, создав новое пустое множество. Возвращает новое множество при успехе или NULL при сбое. Поднимается TypeError, если iterable на самом деле не является итерабельным. Конструктор также полезен для копирования множества (c=set(s)).

PyObject* PyFrozenSet_New(PyObject *iterable)
Return value: New reference.

Возвращает новый frozenset, содержащий объекты, возвращенный iterable. Возможно, iterable равен NULL для создания нового пустого фрозенсета. Возвращает новое множество при успехе или NULL при сбое. Поднимается TypeError, если iterable не является итерируемым.

Следующие функции и макросы доступны для сущности set или frozenset или сущности их подтипов.

Py_ssize_t PySet_Size(PyObject *anyset)

Возвращает длину объекта set или frozenset. Эквивалентно len(anyset). Вызывает PyExc_SystemError, если anyset не является set, frozenset или сущностью подтипа.

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)

Макро-форма PySet_Size() без проверки ошибок.

int PySet_Contains(PyObject *anyset, PyObject *key)

Возвращает 1 при обнаружении, 0 при отсутствии и -1 при обнаружении ошибки. В отличие от метода Python __contains__(), эта функция не преобразует невидимые множества автоматически во временные фрозенсеты. Поднимается TypeError, если key является нехэшируемым. Поднимается PyExc_SystemError, если anyset не является set, frozenset или сущностью подтипа.

int PySet_Add(PyObject *set, PyObject *key)

Добавление key в set сущность. Также работает с frozenset сущности (как и PyTuple_SetItem() можно использовать заполнив значения новых фрозенсетов, прежде чем они будут подвергнуты воздействию другого кода). Возвращает 0 при успехе или -1 при сбое. Поднимается TypeError, если key является нехэшируемым. Поднимается MemoryError, если нет места для роста. Создается SystemError, если set не является сущностью set или его подтипа.

Следующие функции доступны для сущности set или его подтипов, но не для сущности frozenset или его подтипов.

int PySet_Discard(PyObject *set, PyObject *key)

Возвращает 1 если найдено и удалено, 0 если не найдено (никаких действий не предпринято) и -1 если обнаружена ошибка. Не вызывает KeyError при отсутствии ключей. Поднимается TypeError, если key является нехэшируемым. В отличие от метода Python discard(), эта функция не преобразует невидимые множества автоматически во временные фрозенсеты. Поднимается PyExc_SystemError, если set не является сущностью set или его подтипом.

PyObject* PySet_Pop(PyObject *set)
Return value: New reference.

Возвращает новую ссылку на произвольный объект в set и удаляет объект из set. Возвращает NULL при отказе. Поднимается KeyError, если множество пусто. Поднимается SystemError, если set не является сущностью set или его подтипа.

int PySet_Clear(PyObject *set)

Очистить существующее множество всех элементов.

int PySet_ClearFreeList()

Очистить свободный список. Возвращает общее количество освобожденных элементов.

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