# Набір об’єктів

У цьому розділі детально описано публічний 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()`).

type PySetObject

  Цей підтип `PyObject` використовується для зберігання внутрішніх даних для об’єктів `set` і `frozenset`. Це схоже на `PyDictObject` тим, що він має фіксований розмір для невеликих наборів (подібно до сховища кортежів) і вказуватиме на окремий блок пам’яті змінного розміру для середніх і великих наборів (подібно списку зберігання). Жодне з полів цієї структури не можна вважати відкритим, і всі можуть бути змінені. Весь доступ має здійснюватися через задокументований API, а не шляхом маніпулювання значеннями в структурі.

PyTypeObject PySet_Type
  Part of the Stable ABI.

  Це екземпляр `PyTypeObject`, що представляє тип `set` Python.

PyTypeObject PyFrozenSet_Type
  Part of the Stable ABI.

  Це екземпляр `PyTypeObject`, що представляє тип `frozenset` Python.

Наступні макроси перевірки типу працюють з покажчиками на будь-який об’єкт 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 PySet_CheckExact(PyObject *p)

  Повертає true, якщо p є об’єктом `set`, але не екземпляром підтипу. Ця функція завжди успішна.

  Added in version 3.10.

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. Part of the Stable ABI.

  Повертає новий `set`, що містить об’єкти, повернуті iterable. Iterable може бути `NULL` для створення нового порожнього набору. Повертає новий набір у разі успіху або `NULL` у разі невдачі. Викликати `TypeError`, якщо iterable насправді не можна ітерувати. Конструктор також корисний для копіювання набору (`c=set(s)`).

PyObject *PyFrozenSet_New(PyObject *iterable)
  Return value: New reference. Part of the Stable ABI.

  Повертає новий `frozenset`, що містить об’єкти, повернуті iterable. Iterable може бути `NULL` для створення нового порожнього замороженого набору. Повертає новий набір у разі успіху або `NULL` у разі невдачі. Викликати `TypeError`, якщо iterable насправді не можна ітерувати.

Наступні функції та макроси доступні для екземплярів `set` або `frozenset` або екземплярів їхніх підтипів.

Py_ssize_t PySet_Size(PyObject *anyset)
  Part of the Stable ABI.

  Return the length of a `set` or `frozenset` object. Equivalent to `len(anyset)`. Raises a `SystemError` if anyset is not a `set`, `frozenset`, or an instance of a subtype.

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)

  Макроформа `PySet_Size()` без перевірки помилок.

int PySet_Contains(PyObject *anyset, PyObject *key)
  Part of the Stable ABI.

  Return `1` if found, `0` if not found, and `-1` if an error is encountered. Unlike the Python `__contains__()` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise a `TypeError` if the key is unhashable. Raise `SystemError` if anyset is not a `set`, `frozenset`, or an instance of a subtype.

int PySet_Add(PyObject *set, PyObject *key)
  Part of the Stable ABI.

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

Наступні функції доступні для екземплярів `set` або його підтипів, але не для екземплярів `frozenset` або його підтипів.

int PySet_Discard(PyObject *set, PyObject *key)
  Part of the Stable ABI.

  Return `1` if found and removed, `0` if not found (no action taken), and `-1` if an error is encountered. Does not raise `KeyError` for missing keys. Raise a `TypeError` if the key is unhashable. Unlike the Python `discard()` method, this function does not automatically convert unhashable sets into temporary frozensets. Raise `SystemError` if set is not an instance of `set` or its subtype.

PyObject *PySet_Pop(PyObject *set)
  Return value: New reference. Part of the Stable ABI.

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

int PySet_Clear(PyObject *set)
  Part of the Stable ABI.

  Empty an existing set of all elements. Return `0` on success. Return `-1` and raise `SystemError` if set is not an instance of `set` or its subtype.

## Deprecated API

PySet_MINSIZE

  A soft deprecated constant representing the size of an internal preallocated table inside `PySetObject` instances.

  This is documented solely for completeness, as there are no guarantees that a given version of CPython uses preallocated tables with a fixed size. In code that does not deal with unstable set internals, `PySet_MINSIZE` can be replaced with a small constant like `8`.

  If looking for the size of a set, use `PySet_Size()` instead.