actually iterable. The constructor is also useful for copying a set
(``c=set(s)``).
+ .. note::
+
+ The operation is atomic on :term:`free threading <free-threaded build>`
+ when *iterable* is a :class:`set`, :class:`frozenset`, :class:`dict` or :class:`frozendict`.
+
.. c:function:: PyObject* PyFrozenSet_New(PyObject *iterable)
set on success or ``NULL`` on failure. Raise :exc:`TypeError` if *iterable* is
not actually iterable.
+ .. note::
+
+ The operation is atomic on :term:`free threading <free-threaded build>`
+ when *iterable* is a :class:`set`, :class:`frozenset`, :class:`dict` or :class:`frozendict`.
+
The following functions and macros are available for instances of :class:`set`
or :class:`frozenset` or instances of their subtypes.
the *key* is unhashable. Raise :exc:`SystemError` if *anyset* is not a
:class:`set`, :class:`frozenset`, or an instance of a subtype.
+ .. note::
+
+ The operation is atomic on :term:`free threading <free-threaded build>`
+ when *key* is :class:`str`, :class:`int`, :class:`float`, :class:`bool` or :class:`bytes`.
.. c:function:: int PySet_Add(PyObject *set, PyObject *key)
:exc:`SystemError` if *set* is not an instance of :class:`set` or its
subtype.
+ .. note::
+
+ The operation is atomic on :term:`free threading <free-threaded build>`
+ when *key* is :class:`str`, :class:`int`, :class:`float`, :class:`bool` or :class:`bytes`.
+
+
The following functions are available for instances of :class:`set` or its
subtypes but not for instances of :class:`frozenset` or its subtypes.
temporary frozensets. Raise :exc:`SystemError` if *set* is not an
instance of :class:`set` or its subtype.
+ .. note::
+
+ The operation is atomic on :term:`free threading <free-threaded build>`
+ when *key* is :class:`str`, :class:`int`, :class:`float`, :class:`bool` or :class:`bytes`.
+
.. c:function:: PyObject* PySet_Pop(PyObject *set)
success. Return ``-1`` and raise :exc:`SystemError` if *set* is not an instance of
:class:`set` or its subtype.
+ .. note::
+
+ In the :term:`free-threaded build`, the set is emptied before its entries
+ are cleared, so other threads will observe an empty set rather than
+ intermediate states.
+
Deprecated API
^^^^^^^^^^^^^^
PyByteArray_AsString:compatible:
PyByteArray_AS_STRING:compatible:
+# Creation - may iterate the iterable argument, calling arbitrary code.
+# Atomic for sets, frozensets, dicts, and frozendicts.
+PySet_New:shared:
+PyFrozenSet_New:shared:
+
+# Size - uses atomic load on free-threaded builds
+PySet_Size:atomic:
+PySet_GET_SIZE:atomic:
+
+# Contains - lock-free, atomic with simple types
+PySet_Contains:shared:
+
+# Mutations - hold per-object lock for duration
+# atomic with simple types
+PySet_Add:shared:
+PySet_Discard:shared:
+
+# Pop - hold per-object lock for duration
+PySet_Pop:atomic:
+
+# Clear - empties the set before clearing
+PySet_Clear:atomic:
+
# Capsule objects (Doc/c-api/capsule.rst)
# Type check - read ob_type pointer, always safe