集合对象

本节详细介绍了 setfrozenset 对象的公共 API。 以下未列出的任何功能最好使用抽象对象协议(包括 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 的子类型用于保存 setfrozenset 对象的内部数据。它类似于 PyDictObject,对于小型集合,它的大小是固定的(非常类似于元组存储),并且对于中大型集合,它将指向一个单独的、大小可变的内存块(非常类似于列表存储)。此结构的任何字段都不应被视为公共字段,并且所有字段都可能会发生更改。所有访问都应通过记录的 API 完成,而不是通过操作结构中的值完成。

PyTypeObject PySet_Type
属于 稳定 ABI 的一部分。

这是 PyTypeObject 的一个实例,表示 Python set 类型。

PyTypeObject PyFrozenSet_Type
属于 稳定 ABI 的一部分。

这是 PyTypeObject 的一个实例,表示 Python frozenset 类型。

以下类型检查宏适用于指向任何 Python 对象的指针。同样,构造函数适用于任何可迭代的 Python 对象。

int PySet_Check(PyObject *p)

如果 pset 对象或子类型的实例,则返回 true。此函数始终成功。

int PyFrozenSet_Check(PyObject *p)

如果 pfrozenset 对象或子类型的实例,则返回 true。此函数始终成功。

int PyAnySet_Check(PyObject *p)

如果 pset 对象、frozenset 对象或子类型的实例,则返回 true。此函数始终成功。

int PySet_CheckExact(PyObject *p)

如果 pset 对象但不是子类型的实例,则返回 true。此函数始终成功。

在 3.10 版本中新增。

int PyAnySet_CheckExact(PyObject *p)

如果 pset 对象或 frozenset 对象但不是子类型的实例,则返回 true。此函数始终成功。

int PyFrozenSet_CheckExact(PyObject *p)

如果 pfrozenset 对象但不是子类型的实例,则返回 true。此函数始终成功。

PyObject *PySet_New(PyObject *iterable)
返回值:新引用。属于 稳定 ABI 的一部分。

返回一个新的 set,其中包含 iterable 返回的对象。 iterable 可以为 NULL 来创建一个新的空集合。成功时返回新集合,失败时返回 NULL。如果 iterable 实际上不可迭代,则引发 TypeError。构造函数也适用于复制集合(c=set(s))。

PyObject *PyFrozenSet_New(PyObject *iterable)
返回值:新引用。属于 稳定 ABI 的一部分。

返回一个由iterable返回的对象组成的新 frozensetiterable 可以是 NULL 以创建一个新的空 frozenset。 成功时返回新的集合,失败时返回 NULL。 如果 iterable 实际上不是可迭代的,则引发 TypeError

以下函数和宏可用于 setfrozenset 的实例或其子类型的实例。

Py_ssize_t PySet_Size(PyObject *anyset)
属于 稳定 ABI 的一部分。

返回 setfrozenset 对象的长度。等同于 len(anyset)。如果 anyset 不是 setfrozenset 或其子类型的实例,则引发 SystemError

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)

PySet_Size() 的宏形式,不进行错误检查。

int PySet_Contains(PyObject *anyset, PyObject *key)
属于 稳定 ABI 的一部分。

如果找到,则返回 1;如果未找到,则返回 0;如果遇到错误,则返回 -1。与 Python 的 __contains__() 方法不同,此函数不会自动将不可哈希的集合转换为临时的 frozenset。如果 key 不可哈希,则引发 TypeError。如果 anyset 不是 setfrozenset 或其子类型的实例,则引发 SystemError

int PySet_Add(PyObject *set, PyObject *key)
属于 稳定 ABI 的一部分。

key 添加到 set 实例。也适用于 frozenset 实例(如 PyTuple_SetItem(),可用于在将全新的 frozenset 公开给其他代码之前填充其值)。成功时返回 0,失败时返回 -1。如果 key 不可哈希,则引发 TypeError。如果没有空间增长,则引发 MemoryError。如果 set 不是 set 或其子类型的实例,则引发 SystemError

以下函数可用于 set 或其子类型的实例,但不能用于 frozenset 或其子类型的实例。

int PySet_Discard(PyObject *set, PyObject *key)
属于 稳定 ABI 的一部分。

如果找到并删除,则返回 1;如果未找到(未执行任何操作),则返回 0;如果遇到错误,则返回 -1。不会为缺少的键引发 KeyError。如果 key 不可哈希,则引发 TypeError。与 Python 的 discard() 方法不同,此函数不会自动将不可哈希的集合转换为临时的 frozenset。如果 set 不是 set 或其子类型的实例,则引发 SystemError

PyObject *PySet_Pop(PyObject *set)
返回值:新引用。属于 稳定 ABI 的一部分。

返回对 set 中任意对象的新引用,并从 set 中删除该对象。失败时返回 NULL。如果集合为空,则引发 KeyError。如果 set 不是 set 或其子类型的实例,则引发 SystemError

int PySet_Clear(PyObject *set)
属于 稳定 ABI 的一部分。

清空现有集合中的所有元素。成功时返回 0。如果set不是 set 或其子类型的实例,则返回 -1 并引发 SystemError