집합 객체
*********

이 절에서는 "set"과 "frozenset" 객체에 대한 공용 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"의 서브 형은 "set"과 "frozenset" 객체 모두의 내부 데이
   터를 담는 데 사용됩니다. 이것은 작은 집합은 고정 크기(튜플 저장과
   매우 흡사함)이고, 중형과 대형 집합은 별도의 가변 크기 메모리 블록(
   리스트 저장소처럼)을 가리킨다는 점에서 "PyDictObject"와 비슷합니다.
   이 구조체의 필드는 아무것도 공개되지 않은 것으로 취급되어야 하며,
   모두 변경될 수 있습니다. 모든 액세스는 구조체의 값을 조작하기보다는
   설명된 API를 통해 수행해야 합니다.

PyTypeObject PySet_Type
    * Part of the 안정 ABI.*

   이것은 파이썬 "set" 형을 나타내는 "PyTypeObject"의 인스턴스입니다.

PyTypeObject PyFrozenSet_Type
    * Part of the 안정 ABI.*

   이것은 파이썬 "frozenset" 형을 나타내는 "PyTypeObject"의 인스턴스입
   니다.

다음 형 검사 매크로는 모든 파이썬 객체에 대한 포인터에서 작동합니다.
마찬가지로, 생성자 함수는 모든 이터러블 파이썬 객체에서 작동합니다.

int PySet_Check(PyObject *p)

   *p*가 "set" 객체나 서브 형의 인스턴스면 참을 반환합니다. 이 함수는
   항상 성공합니다.

int PyFrozenSet_Check(PyObject *p)

   *p*가 "frozenset" 객체나 서브 형의 인스턴스면 참을 반환합니다. 이
   함수는 항상 성공합니다.

int PyAnySet_Check(PyObject *p)

   *p*가 "set" 객체, "frozenset" 객체 또는 서브 형의 인스턴스면 참을
   반환합니다. 이 함수는 항상 성공합니다.

int PySet_CheckExact(PyObject *p)

   *p*가 "set" 객체이지만, 서브 형의 인스턴스는 아니면 참을 반환합니다
   . 이 함수는 항상 성공합니다.

   Added in version 3.10.

int PyAnySet_CheckExact(PyObject *p)

   *p*가 "set" 객체나 "frozenset" 객체이지만, 서브 형의 인스턴스는 아
   니면 참을 반환합니다. 이 함수는 항상 성공합니다.

int PyFrozenSet_CheckExact(PyObject *p)

   *p*가 "frozenset" 객체이지만, 서브 형의 인스턴스는 아니면 참을 반환
   합니다. 이 함수는 항상 성공합니다.

PyObject *PySet_New(PyObject *iterable)
    *반환값: 새 참조.** Part of the 안정 ABI.** Thread safety: Safe
   for concurrent use on the same object.*

   *iterable*에 의해 반환된 객체를 포함하는 새로운 "set"을 반환합니다.
   *iterable*은 새로운 빈 집합을 만들기 위해 "NULL" 일 수 있습니다. 성
   공하면 새 집합을, 실패하면 "NULL"을 반환합니다. *iterable*이 실제로
   이터러블이 아니면 "TypeError"를 발생시킵니다. 생성자는 집합을 복사
   할 때도 유용합니다 ("c=set(s)").

   참고:

     The operation is atomic on *free threading* when *iterable* is a
     "set", "frozenset", "dict" or "frozendict".

PyObject *PyFrozenSet_New(PyObject *iterable)
    *반환값: 새 참조.** Part of the 안정 ABI.** Thread safety: Safe
   for concurrent use on the same object.*

   *iterable*에 의해 반환된 객체를 포함한 새로운 "frozenset"을 반환합
   니다. *iterable*은 새로운 빈 frozenset을 만들기 위해 "NULL" 일 수
   있습니다. 성공하면 새 집합을, 실패하면 "NULL"을 반환합니다.
   *iterable*이 실제로 이터러블이 아니면 "TypeError"를 발생시킵니다.

   참고:

     The operation is atomic on *free threading* when *iterable* is a
     "set", "frozenset", "dict" or "frozendict".

"set" 이나 "frozenset"의 인스턴스 또는 그들의 서브 형의 인스턴스에 대
해 다음 함수와 매크로를 사용할 수 있습니다.

Py_ssize_t PySet_Size(PyObject *anyset)
    * Part of the 안정 ABI.** Thread safety: Atomic.*

   "set" 이나 "frozenset" 객체의 길이를 반환합니다. "len(anyset)"와 동
   등합니다. *anyset*이 "set", "frozenset" 또는 서브 형의 인스턴스가
   아니면 "SystemError"를 발생시킵니다.

Py_ssize_t PySet_GET_SIZE(PyObject *anyset)
    * Thread safety: Atomic.*

   에러 검사 없는 "PySet_Size()"의 매크로 형식.

int PySet_Contains(PyObject *anyset, PyObject *key)
    * Part of the 안정 ABI.** Thread safety: Safe for concurrent use
   on the same object.*

   발견되면 "1"을, 발견되지 않으면 "0"을, 에러가 발생하면 "-1"을 반환
   합니다. 파이썬 "__contains__()" 메서드와는 달리, 이 함수는 해시 불
   가능한 집합을 임시 frozenset으로 자동 변환하지 않습니다. *key*가 해
   시 불가능하면, "TypeError"를 발생시킵니다. *anyset*이 "set",
   "frozenset" 또는 서브 형의 인스턴스가 아니면 "SystemError"를 발생시
   킵니다.

   참고:

     The operation is atomic on *free threading* when *key* is "str",
     "int", "float", "bool" or "bytes".

int PySet_Add(PyObject *set, PyObject *key)
    * Part of the 안정 ABI.** Thread safety: Safe for concurrent use
   on the same object.*

   *key*를 "set" 인스턴스에 추가합니다. 또한 "frozenset" 인스턴스에도
   작동합니다 ("PyTuple_SetItem()"처럼 다른 코드에 노출되기 전에 새로
   운 frozenset의 값을 채우는 데 사용할 수 있습니다). 성공하면 "0"을,
   실패하면 "-1"을 반환합니다. *key*가 해시 불가능하면, "TypeError"를
   발생시킵니다. 성장할 공간이 없다면 "MemoryError"를 발생시킵니다.
   *set*이 "set" 이나 그 서브 형의 인스턴스가 아니면 "SystemError"를
   발생시킵니다.

   참고:

     The operation is atomic on *free threading* when *key* is "str",
     "int", "float", "bool" or "bytes".

다음 함수는 "set" 이나 그것의 서브 형의 인스턴스에는 사용할 수 있지만,
"frozenset" 이나 그 서브 형의 인스턴스에는 사용할 수 없습니다.

int PySet_Discard(PyObject *set, PyObject *key)
    * Part of the 안정 ABI.** Thread safety: Safe for concurrent use
   on the same object.*

   Return "1" if found and removed, "0" if not found (no action
   taken), and "-1" if an error is encountered.  Does not raise
   "KeyError" for missing keys.  Raise a "TypeError" if the *key* is
   unhashable.  Unlike the Python "discard()" method, this function
   does not automatically convert unhashable sets into temporary
   frozensets. Raise "SystemError" if *set* is not an instance of
   "set" or its subtype.

   참고:

     The operation is atomic on *free threading* when *key* is "str",
     "int", "float", "bool" or "bytes".

PyObject *PySet_Pop(PyObject *set)
    *반환값: 새 참조.** Part of the 안정 ABI.** Thread safety:
   Atomic.*

   *set*에 들어있는 임의의 객체에 대한 새 참조를 반환하고, *set*에서
   객체를 제거합니다. 실패하면 "NULL"을 반환합니다. 집합이 비어 있으면
   , "KeyError"를 발생시킵니다. *set*이 "set" 이나 그 서브 형의 인스턴
   스가 아니면 "SystemError"를 발생시킵니다.

int PySet_Clear(PyObject *set)
    * Part of the 안정 ABI.** Thread safety: Atomic.*

   기존의 모든 요소 집합을 비웁니다. 성공하면 "0"을 반환합니다. *set*
   이 "set"이나 그 서브타입의 인스턴스가 아니면 "SystemError"를 발생시
   키고 "-1"을 반환합니다.

   참고:

     In the *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
==============

PySet_MINSIZE

   A constant representing the size of an internal preallocated table
   inside "PySetObject" instances.

   This is documented solely for completeness, as there are no
   guarantees that a given version of CPython uses preallocated tables
   with a fixed size. In code that does not deal with unstable set
   internals, "PySet_MINSIZE" can be replaced with a small constant
   like "8".

   If looking for the size of a set, use "PySet_Size()" instead.

   Soft deprecated since version 3.14.
