Объекты множеств
В этом разделе подробно описан публичный 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 -
Входит в стабильный ABI.
Это экземпляр
PyTypeObject, представляющий тип Pythonset.
-
PyTypeObject PyFrozenSet_Type -
Входит в стабильный ABI.
Это экземпляр
PyTypeObject, представляющий тип Pythonfrozenset.
Следующие макросы проверки типов работают с указателями на любые объекты 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 PySet_CheckExact(PyObject *p) -
Возвращает истину, если p является объектом
set, но не экземпляром подтипа. Эта функция всегда завершается успешно.Добавлено в версии 3.10.
-
int PyAnySet_CheckExact(PyObject *p) -
Возвращает истину, если p является объектом
setили объектомfrozenset, но не экземпляром подтипа. Эта функция всегда завершается успешно.
-
int PyFrozenSet_CheckExact(PyObject *p) -
Возвращает истину, если p является объектом
frozenset, но не экземпляром подтипа. Эта функция всегда завершается успешно.
-
PyObject *PySet_New(PyObject *iterable) -
Возвращаемое значение: новая ссылка.Входит в стабильный ABI.Потокобезопасность: безопасно для одновременного использования с одним и тем же объектом.
Возвращает новое множество
set, содержащее объекты, возвращённые итерацией по iterable. Значение iterable может бытьNULL, чтобы создать новое пустое множество. В случае успеха возвращает новое множество, а в случае ошибки —NULL. ВызываетTypeError, если iterable на самом деле не является итерируемым объектом. Конструктор также полезен для копирования множества (c=set(s)).Примечание
Операция атомарна при свободной многопоточности, если iterable — это
set,frozensetилиdict.
-
PyObject *PyFrozenSet_New(PyObject *iterable) -
Возвращаемое значение: новая ссылка.Входит в стабильный ABI.Потокобезопасность: безопасно для одновременного использования с одним и тем же объектом.
Возвращает новое неизменяемое множество
frozenset, содержащее объекты, возвращённые итерацией по iterable. Значение iterable может бытьNULL, чтобы создать новое пустое неизменяемое множество. В случае успеха возвращает новое множество, а в случае ошибки —NULL. ВызываетTypeError, если iterable на самом деле не является итерируемым объектом.Примечание
Операция атомарна при свободной многопоточности, если iterable — это
set,frozensetилиdict.
Следующие функции и макросы доступны для экземпляров set или frozenset, а также для экземпляров их подтипов.
-
Py_ssize_t PySet_Size(PyObject *anyset) -
Входит в стабильный 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) -
Входит в стабильный ABI.Потокобезопасность: безопасно для одновременного использования с одним и тем же объектом.
Возвращает
1, если элемент найден,0, если не найден, и-1при возникновении ошибки. В отличие от метода Python__contains__(), эта функция не преобразует автоматически нехешируемые множества во временные неизменяемые множества. ВызываетTypeError, если key не хешируется. ВызываетSystemError, если anyset не является множествомset, неизменяемым множествомfrozensetили экземпляром подтипа.
-
int PySet_Add(PyObject *set, PyObject *key) -
Входит в стабильный ABI.Потокобезопасность: безопасно для одновременного использования с одним и тем же объектом.
Добавляет key в экземпляр множества
set. Работает также с экземплярамиfrozenset(как иPyTuple_SetItem(), эту функцию можно использовать для заполнения новых неизменяемых множеств значениями до того, как они станут доступны другому коду). В случае успеха возвращает0, а в случае ошибки —-1. ВызываетTypeError, если key не хешируется. ВызываетMemoryError, если нет места для увеличения размера. ВызываетSystemError, если set не является экземпляромsetили его подтипа.
Следующие функции доступны для экземпляров set или его подтипов, но не для экземпляров frozenset или его подтипов.
-
int PySet_Discard(PyObject *set, PyObject *key) -
Входит в стабильный ABI.Потокобезопасность: безопасно для одновременного использования с одним и тем же объектом.
Возвращает
1, если элемент найден и удалён,0, если он не найден (никаких действий не выполняется), и-1при возникновении ошибки. Не вызываетKeyErrorдля отсутствующих ключей. ВызываетTypeError, если key не хешируется. В отличие от метода Pythondiscard(), эта функция не преобразует автоматически нехешируемые множества во временные неизменяемые множества. ВызываетSystemError, если set не является экземпляром множестваsetили его подтипа.
-
PyObject *PySet_Pop(PyObject *set) -
Возвращаемое значение: новая ссылка.Входит в стабильный ABI.Потокобезопасность: атомарная операция.
Возвращает новую ссылку на произвольный объект из set и удаляет этот объект из set. В случае ошибки возвращает
NULL. ВызываетKeyError, если множество пусто. ВызываетSystemError, если set не является экземпляром множестваsetили его подтипа.
-
int PySet_Clear(PyObject *set) -
Входит в стабильный ABI.Потокобезопасность: атомарная операция.
Удаляет все элементы из существующего множества. В случае успеха возвращает
0. Возвращает-1и вызываетSystemError, если set не является экземпляром множестваsetили его подтипа.Примечание
В сборке со свободной многопоточностью множество очищается до удаления его элементов, поэтому другие потоки увидят пустое множество, а не промежуточные состояния.
Устаревший API
-
PySet_MINSIZE -
Константа, обозначающая размер внутренней предварительно выделенной таблицы в экземплярах
PySetObject.Эта константа документирована исключительно для полноты описания, поскольку нет гарантий, что конкретная версия CPython использует предварительно выделенные таблицы фиксированного размера. В коде, который не работает с нестабильными внутренними данными множеств,
PySet_MINSIZEможно заменить небольшой константой, например8.Чтобы узнать размер множества, используйте
PySet_Size().Мягко устарела начиная с версии 3.14.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/set.html