Документация Python неофициальный перевод

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

Новое в версии 2.5.

В этом разделе описывается публичный 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, представляющий тип set языка Python.
PyTypeObject PyFrozenSet_Type
Это экземпляр PyTypeObject, представляющий тип frozenset языка Python.

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

int PySet_Check(PyObject *p)

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

Новое в версии 2.6.

int PyFrozenSet_Check(PyObject *p)

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

Новое в версии 2.6.

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)
Возвращаемое значение: новая ссылка.

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

PyObject* PyFrozenSet_New(PyObject *iterable)
Возвращаемое значение: новая ссылка.

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

Изменено в версии 2.6: Теперь гарантированно возвращает новый frozenset. Ранее frozenset нулевой длины был синглетоном. Это мешало построению новых frozenset с помощью PySet_Add().

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

Py_ssize_t PySet_Size(PyObject *anyset)

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

Изменено в версии 2.5: Эта функция возвращала int. Это может потребовать изменений в вашем коде для корректной поддержки 64-разрядных систем.

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
Макроформа PySet_Size() без проверки ошибок.
int PySet_Contains(PyObject *anyset, PyObject *key)
Возвращает 1, если найдено, 0, если не найдено, и -1, если возникла ошибка. В отличие от метода Python __contains__(), эта функция не преобразует автоматически нехешируемые множества во временные frozenset. Вызывает TypeError, если key нехешируем. Вызывает PyExc_SystemError, если anyset не является set, frozenset или экземпляром подтипа.
int PySet_Add(PyObject *set, PyObject *key)

Добавляет key в экземпляр set. Не применяется к экземплярам frozenset . Возвращает 0 при успехе или -1 при ошибке. Вызывает TypeError, если key нехешируем. Вызывает MemoryError, если недостаточно места для расширения. Вызывает SystemError, если set не является экземпляром set или его подтипа.

Изменено в версии 2.6: Теперь работает с экземплярами frozenset или его подтипов. Подобно PyTuple_SetItem(), эту функцию можно использовать для заполнения значений новых frozenset до того, как они станут доступны другому коду.

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

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

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

int PySet_Clear(PyObject *set)
Очищает существующее множество от всех элементов.