17db96d56Sopenharmony_ci.. highlight:: c
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci.. _setobjects:
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ciSet Objects
67db96d56Sopenharmony_ci-----------
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci.. sectionauthor:: Raymond D. Hettinger <python@rcn.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. index::
127db96d56Sopenharmony_ci   pair: object; set
137db96d56Sopenharmony_ci   pair: object; frozenset
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciThis section details the public API for :class:`set` and :class:`frozenset`
167db96d56Sopenharmony_ciobjects.  Any functionality not listed below is best accessed using either
177db96d56Sopenharmony_cithe abstract object protocol (including :c:func:`PyObject_CallMethod`,
187db96d56Sopenharmony_ci:c:func:`PyObject_RichCompareBool`, :c:func:`PyObject_Hash`,
197db96d56Sopenharmony_ci:c:func:`PyObject_Repr`, :c:func:`PyObject_IsTrue`, :c:func:`PyObject_Print`, and
207db96d56Sopenharmony_ci:c:func:`PyObject_GetIter`) or the abstract number protocol (including
217db96d56Sopenharmony_ci:c:func:`PyNumber_And`, :c:func:`PyNumber_Subtract`, :c:func:`PyNumber_Or`,
227db96d56Sopenharmony_ci:c:func:`PyNumber_Xor`, :c:func:`PyNumber_InPlaceAnd`,
237db96d56Sopenharmony_ci:c:func:`PyNumber_InPlaceSubtract`, :c:func:`PyNumber_InPlaceOr`, and
247db96d56Sopenharmony_ci:c:func:`PyNumber_InPlaceXor`).
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci.. c:type:: PySetObject
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci   This subtype of :c:type:`PyObject` is used to hold the internal data for both
307db96d56Sopenharmony_ci   :class:`set` and :class:`frozenset` objects.  It is like a :c:type:`PyDictObject`
317db96d56Sopenharmony_ci   in that it is a fixed size for small sets (much like tuple storage) and will
327db96d56Sopenharmony_ci   point to a separate, variable sized block of memory for medium and large sized
337db96d56Sopenharmony_ci   sets (much like list storage). None of the fields of this structure should be
347db96d56Sopenharmony_ci   considered public and all are subject to change.  All access should be done through
357db96d56Sopenharmony_ci   the documented API rather than by manipulating the values in the structure.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci.. c:var:: PyTypeObject PySet_Type
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci   This is an instance of :c:type:`PyTypeObject` representing the Python
417db96d56Sopenharmony_ci   :class:`set` type.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci.. c:var:: PyTypeObject PyFrozenSet_Type
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci   This is an instance of :c:type:`PyTypeObject` representing the Python
477db96d56Sopenharmony_ci   :class:`frozenset` type.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ciThe following type check macros work on pointers to any Python object. Likewise,
507db96d56Sopenharmony_cithe constructor functions work with any iterable Python object.
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci.. c:function:: int PySet_Check(PyObject *p)
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci   Return true if *p* is a :class:`set` object or an instance of a subtype.
567db96d56Sopenharmony_ci   This function always succeeds.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci.. c:function:: int PyFrozenSet_Check(PyObject *p)
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci   Return true if *p* is a :class:`frozenset` object or an instance of a
617db96d56Sopenharmony_ci   subtype.  This function always succeeds.
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. c:function:: int PyAnySet_Check(PyObject *p)
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an
667db96d56Sopenharmony_ci   instance of a subtype.  This function always succeeds.
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci.. c:function:: int PySet_CheckExact(PyObject *p)
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci   Return true if *p* is a :class:`set` object but not an instance of a
717db96d56Sopenharmony_ci   subtype.  This function always succeeds.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   .. versionadded:: 3.10
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci.. c:function:: int PyAnySet_CheckExact(PyObject *p)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci   Return true if *p* is a :class:`set` object or a :class:`frozenset` object but
787db96d56Sopenharmony_ci   not an instance of a subtype.  This function always succeeds.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci.. c:function:: int PyFrozenSet_CheckExact(PyObject *p)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   Return true if *p* is a :class:`frozenset` object but not an instance of a
847db96d56Sopenharmony_ci   subtype.  This function always succeeds.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. c:function:: PyObject* PySet_New(PyObject *iterable)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   Return a new :class:`set` containing objects returned by the *iterable*.  The
907db96d56Sopenharmony_ci   *iterable* may be ``NULL`` to create a new empty set.  Return the new set on
917db96d56Sopenharmony_ci   success or ``NULL`` on failure.  Raise :exc:`TypeError` if *iterable* is not
927db96d56Sopenharmony_ci   actually iterable.  The constructor is also useful for copying a set
937db96d56Sopenharmony_ci   (``c=set(s)``).
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci.. c:function:: PyObject* PyFrozenSet_New(PyObject *iterable)
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci   Return a new :class:`frozenset` containing objects returned by the *iterable*.
997db96d56Sopenharmony_ci   The *iterable* may be ``NULL`` to create a new empty frozenset.  Return the new
1007db96d56Sopenharmony_ci   set on success or ``NULL`` on failure.  Raise :exc:`TypeError` if *iterable* is
1017db96d56Sopenharmony_ci   not actually iterable.
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciThe following functions and macros are available for instances of :class:`set`
1057db96d56Sopenharmony_cior :class:`frozenset` or instances of their subtypes.
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci.. c:function:: Py_ssize_t PySet_Size(PyObject *anyset)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci   .. index:: pair: built-in function; len
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci   Return the length of a :class:`set` or :class:`frozenset` object. Equivalent to
1137db96d56Sopenharmony_ci   ``len(anyset)``.  Raises a :exc:`PyExc_SystemError` if *anyset* is not a
1147db96d56Sopenharmony_ci   :class:`set`, :class:`frozenset`, or an instance of a subtype.
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci.. c:function:: Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   Macro form of :c:func:`PySet_Size` without error checking.
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci.. c:function:: int PySet_Contains(PyObject *anyset, PyObject *key)
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci   Return ``1`` if found, ``0`` if not found, and ``-1`` if an error is encountered.  Unlike
1257db96d56Sopenharmony_ci   the Python :meth:`__contains__` method, this function does not automatically
1267db96d56Sopenharmony_ci   convert unhashable sets into temporary frozensets.  Raise a :exc:`TypeError` if
1277db96d56Sopenharmony_ci   the *key* is unhashable. Raise :exc:`PyExc_SystemError` if *anyset* is not a
1287db96d56Sopenharmony_ci   :class:`set`, :class:`frozenset`, or an instance of a subtype.
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci.. c:function:: int PySet_Add(PyObject *set, PyObject *key)
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci   Add *key* to a :class:`set` instance.  Also works with :class:`frozenset`
1347db96d56Sopenharmony_ci   instances (like :c:func:`PyTuple_SetItem` it can be used to fill in the values
1357db96d56Sopenharmony_ci   of brand new frozensets before they are exposed to other code).  Return ``0`` on
1367db96d56Sopenharmony_ci   success or ``-1`` on failure. Raise a :exc:`TypeError` if the *key* is
1377db96d56Sopenharmony_ci   unhashable. Raise a :exc:`MemoryError` if there is no room to grow.  Raise a
1387db96d56Sopenharmony_ci   :exc:`SystemError` if *set* is not an instance of :class:`set` or its
1397db96d56Sopenharmony_ci   subtype.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ciThe following functions are available for instances of :class:`set` or its
1437db96d56Sopenharmony_cisubtypes but not for instances of :class:`frozenset` or its subtypes.
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci.. c:function:: int PySet_Discard(PyObject *set, PyObject *key)
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci   Return ``1`` if found and removed, ``0`` if not found (no action taken), and ``-1`` if an
1497db96d56Sopenharmony_ci   error is encountered.  Does not raise :exc:`KeyError` for missing keys.  Raise a
1507db96d56Sopenharmony_ci   :exc:`TypeError` if the *key* is unhashable.  Unlike the Python :meth:`~set.discard`
1517db96d56Sopenharmony_ci   method, this function does not automatically convert unhashable sets into
1527db96d56Sopenharmony_ci   temporary frozensets. Raise :exc:`PyExc_SystemError` if *set* is not an
1537db96d56Sopenharmony_ci   instance of :class:`set` or its subtype.
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci.. c:function:: PyObject* PySet_Pop(PyObject *set)
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci   Return a new reference to an arbitrary object in the *set*, and removes the
1597db96d56Sopenharmony_ci   object from the *set*.  Return ``NULL`` on failure.  Raise :exc:`KeyError` if the
1607db96d56Sopenharmony_ci   set is empty. Raise a :exc:`SystemError` if *set* is not an instance of
1617db96d56Sopenharmony_ci   :class:`set` or its subtype.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci.. c:function:: int PySet_Clear(PyObject *set)
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci   Empty an existing set of all elements.
167