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

В разделе подробно рассказано об открытом 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)

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

int PyFrozenSet_Check(PyObject *p)

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

int PyAnySet_Check(PyObject *p)

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

int PyAnySet_CheckExact(PyObject *p)

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

int PyFrozenSet_CheckExact(PyObject *p)

Возвращает истину, если 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.