Set Objects

本节详细说明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())。

PySetObject

PyObject的此子类型用于保存setfrozenset对象的内部数据。它像一个PyDictObject,它是一个固定大小的小集合(很像元组存储),并指向一个单独的,可变大小的内存块为中型和大型集合(很像列表存储)。此结构的所有字段都不应被视为公开,并且可能会更改。所有访问都应通过记录的API完成,而不是通过操作结构中的值。

PyTypeObject PySet_Type

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

PyTypeObject PyFrozenSet_Type

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

以下类型检查宏可用于指向任何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 PyAnySet_CheckExact(PyObject *p)

如果pset对象或frozenset对象,而不是子类型的实例,则返回true。

int PyFrozenSet_CheckExact(PyObject *p)

如果pfrozenset对象,而不是子类型的实例,则返回true。

PyObject* PySet_New(PyObject *iterable)
返回值:新引用。

返回包含可迭代返回的对象的新set可迭代可以是NULL以创建新的空集。在失败时返回新的成功或NULL引发TypeError if iterable实际上不可迭代。构造函数还可用于复制集合(c=set(s))。

PyObject* PyFrozenSet_New(PyObject *iterable)
返回值:新引用。

返回包含可迭代返回的对象的新frozenset可迭代可以是NULL来创建一个新的空的frozenset。在失败时返回新的成功或NULL引发TypeError if iterable实际上不可迭代。

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

Py_ssize_t PySet_Size(PyObject *anyset)

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

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)

PySet_Size()的宏形式,无错误检查。

int PySet_Contains(PyObject *anyset, PyObject *key)

返回1如果找到,0如果没有找到,和-1如果遇到错误。与Python __contains__()方法不同,此函数不会将不可隐藏集自动转换为临时冻结集。如果不可消除,则引发TypeError引发PyExc_SystemError if anyset不是setfrozenset或子类型的实例。

int PySet_Add(PyObject *set, PyObject *key)

添加到set实例。也可以使用frozenset实例(如PyTuple_SetItem(),它可以用来填充新的frozensets的值,然后暴露给其他代码)。成功返回0,失败返回-1。如果不可消除,则引发TypeError如果没有增长空间,则引发MemoryError如果设置不是set或其子类型的实例,则引发SystemError

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

int PySet_Discard(PyObject *set, PyObject *key)

返回1如果找到和删除,0如果没有找到(没有采取行动),和-1如果遇到错误。对于缺少的键,不引发KeyError如果不可消除,则引发TypeError与Python discard()方法不同,此函数不会将不可隐藏集自动转换为临时冻结集。引发PyExc_SystemError if set不是set的实例或其子类型。

PyObject* PySet_Pop(PyObject *set)
返回值:新引用。

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

int PySet_Clear(PyObject *set)

清空所有元素的现有集合。

int PySet_ClearFreeList()

清除空闲列表。返回已释放项目的总数。

版本3.3中的新功能。