Содержание страницы
Объекты множеств¶Set Objects
В этом разделе описывается публичный 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¶
- Часть Stable ABI.
Это экземпляр
PyTypeObject, представляющий типsetPython.
-
PyTypeObject PyFrozenSet_Type¶
- Часть Stable ABI.
Это экземпляр
PyTypeObject, представляющий типfrozensetPython.
Следующие макросы проверки типа работают с указателями на любой объект 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, но не экземпляром подтипа. Эта функция всегда завершается успешно.Добавлено в версии 3.10.
-
int PyAnySet_CheckExact(PyObject *p)¶
Возвращает true, если p является объектом
setили объектомfrozenset, но не экземпляром подтипа. Эта функция всегда завершается успешно.
-
int PyFrozenSet_CheckExact(PyObject *p)¶
Возвращает true, если p является объектом
frozenset, но не экземпляром подтипа. Эта функция всегда завершается успешно.
-
PyObject *PySet_New(PyObject *iterable)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI. Потокобезопасность: Безопасно для одновременного использования на одном объекте.
Возвращает новый
set, содержащий объекты, полученные из iterable. iterable может бытьNULLдля создания нового пустого множества. При успехе возвращает новое множество, при неудаче –NULL. ВозбуждаетTypeError, если iterable на самом деле не итерируем. Конструктор также удобен для копирования множества (c=set(s)).Примечание
Операция атомарна на free threading, когда iterable является
set,frozenset,dictилиfrozendict.
-
PyObject *PyFrozenSet_New(PyObject *iterable)¶
- Возвращаемое значение: новая ссылка. Часть Stable ABI. Потокобезопасность: Безопасно для одновременного использования на одном объекте.
Возвращает новый
frozenset, содержащий объекты, полученные из iterable. iterable может бытьNULLдля создания нового пустого frozenset. При успехе возвращает новое множество, при неудаче –NULL. ВозбуждаетTypeError, если iterable на самом деле не итерируем.Примечание
Операция атомарна на free threading, когда iterable является
set,frozenset,dictилиfrozendict.
Следующие функции и макросы доступны для экземпляров set или frozenset, или экземпляров их подтипов.
-
Py_ssize_t PySet_Size(PyObject *anyset)¶
- Часть Stable ABI.Потокобезопасность: Атомарно.
Возвращает длину объекта
setилиfrozenset. Эквивалентноlen(anyset). ВозбуждаетSystemError, если anyset не являетсяset,frozensetили экземпляром подтипа.
-
Py_ssize_t PySet_GET_SIZE(PyObject *anyset)¶
- Потокобезопасность: атомарно.
Макроформа
PySet_Size()без проверки ошибок.
-
int PySet_Contains(PyObject *anyset, PyObject *key)¶
- Часть Stable ABI. Потокобезопасность: Безопасно для одновременного использования на одном объекте.
Возвращает
1, если элемент найден,0, если не найден, и-1, если произошла ошибка. В отличие от метода__contains__()в Python, эта функция не преобразует автоматически нехэшируемые множества во временные замороженные множества. ВозбуждаетTypeError, если ключ нехэшируем. ВозбуждаетSystemError, если любой набор не являетсяset,frozensetили экземпляром подтипа.
-
int PySet_Add(PyObject *set, PyObject *key)¶
- Часть Stable ABI. Потокобезопасность: Безопасно для одновременного использования на одном объекте.
Добавляет ключ в экземпляр
set. Также работает с экземплярамиfrozenset(как иPyTuple_SetItem(), может использоваться для заполнения значений новых неизменяемых множеств до того, как они будут открыты другому коду). Возвращает0в случае успеха или-1при неудаче. ВозбуждаетTypeError, если ключ нехэшируем. ВозбуждаетMemoryError, если нет места для роста. ВозбуждаетSystemError, если set не является экземпляромsetили его подтипа.
Следующие функции доступны для экземпляров set или его подтипов, но не для экземпляров frozenset или его подтипов.
-
int PySet_Discard(PyObject *set, PyObject *key)¶
- Часть Stable ABI. Потокобезопасность: Безопасно для одновременного использования на одном объекте.
Возвращает
1, если элемент найден и удалён,0, если не найден (действие не выполняется), и-1, если произошла ошибка. Не возбуждаетKeyErrorдля отсутствующих ключей. ВозбуждаетTypeError, если ключ нехэшируем. В отличие от методаdiscard()в Python, эта функция не преобразует автоматически нехэшируемые множества во временные замороженные множества. ВозбуждаетSystemError, если множество не является экземпляромsetили его подтипа.
-
PyObject *PySet_Pop(PyObject *set)¶
- Возвращаемое значение: новая ссылка. Часть стабильного ABI. Потокобезопасность: атомарно.
Возвращает новую ссылку на произвольный объект в множестве и удаляет этот объект из множества. Возвращает
NULLпри неудаче. ВозбуждаетKeyError, если множество пусто. ВозбуждаетSystemError, если set не является экземпляромsetили его подтипа.
-
int PySet_Clear(PyObject *set)¶
- Часть Stable ABI.Потокобезопасность: Атомарно.
Опустошает существующее множество, удаляя все элементы. Возвращает
0в случае успеха. Возвращает-1и возбуждаетSystemError, если set не является экземпляромsetили его подтипа.Примечание
В сборке со свободными потоками множество опустошается до очистки своих записей, поэтому другие потоки увидят пустое множество, а не промежуточные состояния.
Устаревший API¶Deprecated API
-
PySet_MINSIZE¶
Константа, представляющая размер внутренней предварительно выделенной таблицы в экземплярах
PySetObject.Она задокументирована исключительно для полноты, поскольку нет гарантий, что данная версия CPython использует предварительно выделенные таблицы фиксированного размера. В коде, который не работает с нестабильными внутренностями множеств,
PySet_MINSIZEможно заменить небольшой константой, например8.Если нужно узнать размер множества, используйте
PySet_Size().Soft deprecated since version 3.14.