> **Источник:** https://python-all.ru/3.3/c-api/set.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

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

В этом разделе описывается публичный API для [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) и [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) объектов. Любая функциональность, не перечисленная ниже, лучше всего доступна через абстрактный объектный протокол (включая [`PyObject_CallMethod()`](https://python-all.ru/3.3/c-api/object.html#PyObject_CallMethod), [`PyObject_RichCompareBool()`](https://python-all.ru/3.3/c-api/object.html#PyObject_RichCompareBool), [`PyObject_Hash()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Hash), [`PyObject_Repr()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Repr), [`PyObject_IsTrue()`](https://python-all.ru/3.3/c-api/object.html#PyObject_IsTrue), [`PyObject_Print()`](https://python-all.ru/3.3/c-api/object.html#PyObject_Print) и [`PyObject_GetIter()`](https://python-all.ru/3.3/c-api/object.html#PyObject_GetIter)) или абстрактный числовой протокол (включая [`PyNumber_And()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_And), [`PyNumber_Subtract()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_Subtract), [`PyNumber_Or()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_Or), [`PyNumber_Xor()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_Xor), [`PyNumber_InPlaceAnd()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_InPlaceAnd), [`PyNumber_InPlaceSubtract()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_InPlaceSubtract), [`PyNumber_InPlaceOr()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_InPlaceOr) и [`PyNumber_InPlaceXor()`](https://python-all.ru/3.3/c-api/number.html#PyNumber_InPlaceXor)).

**`PySetObject`**

Этот подтип [`PyObject`](https://python-all.ru/3.3/c-api/structures.html#PyObject) используется для хранения внутренних данных как для объектов [`set`](https://python-all.ru/3.3/library/stdtypes.html#set), так и для [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset). Он подобен [`PyDictObject`](https://python-all.ru/3.3/c-api/dict.html#PyDictObject) в том, что имеет фиксированный размер для небольших множеств (как хранение кортежей) и будет указывать на отдельный блок памяти переменного размера для средних и больших множеств (как хранение списков). Ни одно из полей этой структуры не должно считаться публичным и может быть изменено. Весь доступ должен осуществляться через документированный API, а не путём манипулирования значениями в структуре.

**[PyTypeObject](https://python-all.ru/3.3/c-api/type.html#PyTypeObject) `PySet_Type`**

Это экземпляр [`PyTypeObject`](https://python-all.ru/3.3/c-api/type.html#PyTypeObject), представляющий тип [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) языка Python.

**[PyTypeObject](https://python-all.ru/3.3/c-api/type.html#PyTypeObject) `PyFrozenSet_Type`**

Это экземпляр [`PyTypeObject`](https://python-all.ru/3.3/c-api/type.html#PyTypeObject), представляющий тип [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) языка Python.

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

#### `int PySet_Check(PyObject *p)`

Возвращает true, если *p* является объектом [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или экземпляром подтипа.

#### `int PyFrozenSet_Check(PyObject *p)`

Возвращает true, если *p* является объектом [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) или экземпляром подтипа.

#### `int PyAnySet_Check(PyObject *p)`

Возвращает true, если *p* является объектом [`set`](https://python-all.ru/3.3/library/stdtypes.html#set), объектом [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) или экземпляром подтипа.

#### `int PyAnySet_CheckExact(PyObject *p)`

Возвращает true, если *p* является объектом [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или объектом [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset), но не экземпляром подтипа.

#### `int PyFrozenSet_CheckExact(PyObject *p)`

Возвращает true, если *p* является объектом [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset), но не экземпляром подтипа.

#### `PyObject* PySet_New(PyObject *iterable)`

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

Возвращает новый [`set`](https://python-all.ru/3.3/library/stdtypes.html#set), содержащий объекты, возвращаемые *iterable*. Значение *iterable* может быть *NULL* для создания нового пустого set. Возвращает новый set при успехе или *NULL* при неудаче. Вызывает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если *iterable* на самом деле не является итерируемым. Конструктор также полезен для копирования set (`c=set(s)`).

#### `PyObject* PyFrozenSet_New(PyObject *iterable)`

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

Возвращает новый [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset), содержащий объекты, возвращаемые *iterable*. Значение *iterable* может быть *NULL* для создания нового пустого frozenset. Возвращает новый frozenset при успехе или *NULL* при неудаче. Вызывает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если *iterable* на самом деле не является итерируемым.

Следующие функции и макросы доступны для экземпляров [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset), а также для экземпляров их подтипов.

#### `Py_ssize_t PySet_Size(PyObject *anyset)`

Возвращает длину объекта [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset). Эквивалентно `len(anyset)`. Вызывает `PyExc_SystemError`, если *anyset* не является [`set`](https://python-all.ru/3.3/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) или экземпляром подтипа.

#### `Py_ssize_t PySet_GET_SIZE(PyObject *anyset)`

Макроформа [`PySet_Size()`](https://python-all.ru/3.3/c-api/set.html#PySet_Size) без проверки ошибок.

#### `int PySet_Contains(PyObject *anyset, PyObject *key)`

Возвращает 1, если найдено, 0, если не найдено, и -1, если возникла ошибка. В отличие от метода Python [`__contains__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__contains__), эта функция не преобразует автоматически нехешируемые множества во временные frozenset. Вызывает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если *key* нехешируем. Вызывает `PyExc_SystemError`, если *anyset* не является [`set`](https://python-all.ru/3.3/library/stdtypes.html#set), [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) или экземпляром подтипа.

#### `int PySet_Add(PyObject *set, PyObject *key)`

Добавляет *key* в экземпляр [`set`](https://python-all.ru/3.3/library/stdtypes.html#set). Также работает с экземплярами [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) (подобно [`PyTuple_SetItem()`](https://python-all.ru/3.3/c-api/tuple.html#PyTuple_SetItem), её можно использовать для заполнения значений совершенно новых frozenset до того, как они будут открыты другому коду). Возвращает 0 при успехе или -1 при неудаче. Вызывает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если *key* нехешируем. Вызывает [`MemoryError`](https://python-all.ru/3.3/library/exceptions.html#MemoryError), если нет места для роста. Вызывает [`SystemError`](https://python-all.ru/3.3/library/exceptions.html#SystemError), если *set* не является экземпляром [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или его подтипа.

Следующие функции доступны для экземпляров [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или его подтипов, но не для экземпляров [`frozenset`](https://python-all.ru/3.3/library/stdtypes.html#frozenset) или его подтипов.

#### `int PySet_Discard(PyObject *set, PyObject *key)`

Возвращает 1, если элемент найден и удалён, 0 – если не найден (действие не выполняется), и -1, если произошла ошибка. Не вызывает [`KeyError`](https://python-all.ru/3.3/library/exceptions.html#KeyError) для отсутствующих ключей. Вызывает [`TypeError`](https://python-all.ru/3.3/library/exceptions.html#TypeError), если *ключ* нехешируемый. В отличие от метода Python [`discard()`](https://python-all.ru/3.3/library/stdtypes.html#set.discard), эта функция не преобразует автоматически нехешируемые множества во временные frozenset. Вызывает `PyExc_SystemError`, если *множество* не является экземпляром [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или его подтипа.

#### `PyObject* PySet_Pop(PyObject *set)`

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

Возвращает новую ссылку на произвольный объект из *множества* и удаляет объект из *множества*. В случае ошибки возвращает *NULL*. Вызывает [`KeyError`](https://python-all.ru/3.3/library/exceptions.html#KeyError), если множество пусто. Вызывает [`SystemError`](https://python-all.ru/3.3/library/exceptions.html#SystemError), если *множество* не является экземпляром [`set`](https://python-all.ru/3.3/library/stdtypes.html#set) или его подтипа.

#### `int PySet_Clear(PyObject *set)`

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

#### `int PySet_ClearFreeList()`

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

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