Set Objects

2.5 版的新Function。

本节详细介绍了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())访问以下未列出的任何Function,PyNumber_InPlaceOr()PyNumber_InPlaceXor())。

  • PySetObject

    • PyObject的此子类型用于保存setfrozenset对象的内部数据。就像PyDictObject一样,它对于小集合(类似于 Tuples 存储)是固定大小的,并且将指向用于中型和大型集合(与列表存储类似)的单独的可变大小的内存块。此结构的任何字段均不应视为公开字段,并且可能会发生变化。所有访问都应pass记录在案的 API 来完成,而不是pass操纵结构中的值来完成。
  • PyTypeObject PySet_Type

  • PyTypeObject PyFrozenSet_Type

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

  • int PySet_Check(PyObject ** p *)
    • 如果* p *是set对象或子类型的实例,则返回 true。

2.6 版的新Function。

  • int PyFrozenSet_Check(PyObject ** p *)
    • 如果* p *是frozenset对象或子类型的实例,则返回 true。

2.6 版的新Function。

  • int PyAnySet_Check(PyObject ** p *)

    • 如果* p *是set对象,frozenset对象或子类型的实例,则返回 true。
  • int PyAnySet_CheckExact(PyObject ** p *)

    • 如果* p *是set对象或frozenset对象,但不是子类型的实例,则返回 true。
  • int PyFrozenSet_CheckExact(PyObject ** p *)

    • 如果* p *是frozenset对象,但不是子类型的实例,则返回 true。
  • PyObject * PySet_New(PyObject *可迭代)

    • 返回值:新参考.

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

返回一个新的frozenset,其中包含* iterable *返回的对象。 * iterable 可以为 NULL ,以创建一个新的空冻结集。如果成功,则返回新集;如果失败,则返回 NULL 。如果 iterable *实际上不是可迭代的,则提高TypeError

在 2.6 版中进行了更改:现在保证返回一个全新的frozenset。以前,零长度的冻结集是一个单例。这妨碍了使用PySet_Add()构建新的冻结集。

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

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

在版本 2.5 中更改:此函数返回int。这可能需要更改您的代码以正确支持 64 位系统。

  • Py_ssize_t PySet_GET_SIZE(PyObject ** anyset *)

  • int PySet_Contains(PyObject *anyset PyObject key *)

    • 如果找到则返回1,如果找不到则返回0,如果遇到错误则返回-1。与 Python contains()方法不同,此函数不会自动将不可哈希集转换为临时冻结集。如果* key 无法散列,请举起TypeError。如果 anyset *不是setfrozenset或子类型的实例,则提高PyExc_SystemError
  • int PySet_Add(PyObject *set PyObject key *)

    • 将* key 添加到set实例。不适用于frozenset个实例。如果成功则返回0,如果失败则返回-1。如果 key 无法散列,请加TypeError。如果没有增长空间,请提高MemoryError。如果 set *不是set或其子类型的实例,则引发SystemError

在 2.6 版中进行了更改:现在可用于frozenset或其子类型的实例。像PyTuple_SetItem()一样,它可以用于在新的冻结集暴露于其他代码之前填充它们的值。

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

  • int PySet_Discard(PyObject *set PyObject key *)

    • 如果找到并删除,则返回1;如果未找到,则返回0(不执行任何操作);如果遇到错误,则返回-1。缺少键不会引发KeyError。如果* key 无法散列,请举起TypeError。与 Python discard()方法不同,此函数不会自动将不可哈希集转换为临时冻结集。如果 set *不是set或其子类型的实例,则提高PyExc_SystemError
  • PyObject * PySet_Pop(PyObject ** set *)

    • 返回值:新参考.

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

  • int PySet_Clear(PyObject ** set *)
    • 清空现有的所有元素集。