# Objetos Conjunto

Esta sección detalla la API pública para objetos `set` y `frozenset`. Se puede acceder mejor a cualquier funcionalidad que no se enumere a continuación utilizando el protocolo de objeto abstracto (que incluye `PyObject_CallMethod()`, `PyObject_RichCompareBool()`, `PyObject_Hash()`, `PyObject_Repr()`, `PyObject_IsTrue()`, `PyObject_Print()`, y `PyObject_GetIter()`) o el protocolo de número abstracto (que incluye `PyNumber_And()`, `PyNumber_Subtract()`, `PyNumber_Or()`, `PyNumber_Xor()`, `PyNumber_InPlaceAnd()`, `PyNumber_InPlaceSubtract()`, `PyNumber_InPlaceOr()`, y `PyNumber_InPlaceXor()`).

`PySetObject`

  Este subtipo de `PyObject` se utiliza para contener los datos internos de los objetos `set` y `frozenset`. Es como un `PyDictObject` en el sentido de que es un tamaño fijo para conjuntos pequeños (muy parecido al almacenamiento de tuplas) y apuntará a un bloque de memoria separado de tamaño variable para conjuntos de tamaño medio y grande (muy similar a la lista almacenamiento). Ninguno de los campos de esta estructura debe considerarse público y está sujeto a cambios. Todo el acceso debe hacerse a través de la API documentada en lugar de manipular los valores en la estructura.

PyTypeObject `PySet_Type`

  Esta es una instancia de `PyTypeObject` que representa el tipo Python `set`.

PyTypeObject `PyFrozenSet_Type`

  Esta es una instancia de `PyTypeObject` que representa el tipo Python `frozenset`.

Los siguientes macros de comprobación de tipos funcionan en punteros a cualquier objeto de Python. Del mismo modo, las funciones del constructor funcionan con cualquier objeto Python iterable.

int `PySet_Check`(PyObject *p)

  Retorna verdadero si p es un objeto `set` o una instancia de un subtipo.

int `PyFrozenSet_Check`(PyObject *p)

  Retorna verdadero si p es un objeto `frozenset` o una instancia de un subtipo.

int `PyAnySet_Check`(PyObject *p)

  Retorna verdadero si p es un objeto `set`, un objeto `frozenset`, o una instancia de un subtipo.

int `PyAnySet_CheckExact`(PyObject *p)

  Retorna verdadero si p es un objeto `set` o un objeto `frozenset` pero no una instancia de un subtipo.

int `PyFrozenSet_CheckExact`(PyObject *p)

  Retorna verdadero si p es un objeto `frozenset` pero no una instancia de un subtipo.

PyObject* `PySet_New`(PyObject *iterable)
  Return value: New reference.

  Retorna un nuevo `set` que contiene objetos retornados por iterable. El iterable puede ser `NULL` para crear un nuevo conjunto vacío. Retorna el nuevo conjunto en caso de éxito o `NULL` en caso de error. Lanza `TypeError` si iterable no es realmente iterable. El constructor también es útil para copiar un conjunto (`c=set(s)`).

PyObject* `PyFrozenSet_New`(PyObject *iterable)
  Return value: New reference.

  Retorna un nuevo `frozenset` que contiene objetos retornados por iterable. El iterable puede ser `NULL` para crear un nuevo conjunto congelado vacío. Retorna el nuevo conjunto en caso de éxito o `NULL` en caso de error. Lanza `TypeError` si iterable no es realmente iterable.

Las siguientes funciones y macros están disponibles para instancias de `set` o `frozenset` o instancias de sus subtipos.

Py_ssize_t `PySet_Size`(PyObject *anyset)

  Retorna la longitud de un objeto `set` o `frozenset`. Equivalente a `len(anyset)`. Lanza un `PyExc_SystemError` si anyset no es `set`, `frozenset`, o una instancia de un subtipo.

Py_ssize_t `PySet_GET_SIZE`(PyObject *anyset)

  Forma macro de `PySet_Size()` sin comprobación de errores.

int `PySet_Contains`(PyObject *anyset, PyObject *key)

  Retorna `1` si se encuentra, `0` si no se encuentra y `-1` si se encuentra un error. A diferencia del método Python `__contains__()`, esta función no convierte automáticamente conjuntos no compartibles en congelados temporales. Lanza un `TypeError` si la key no se puede compartir. Lanza `PyExc_SystemError` si anyset no es un `set`, `frozenset`, o una instancia de un subtipo.

int `PySet_Add`(PyObject *set, PyObject *key)

  Agrega key a una instancia de `set`. También funciona con instancias `frozenset` (como `PyTuple_SetItem()` se puede usar para completar los valores de los frozensets nuevos antes de que estén expuestos a otro código). Retorna `0` en caso de éxito o `-1` en caso de error. Lanza un `TypeError` si la key no se puede compartir. Lanza un `MemoryError` si no hay espacio para crecer. Lanza un `SystemError` si set no es una instancia de `set` o su subtipo.

Las siguientes funciones están disponibles para instancias de `set` o sus subtipos, pero no para instancias de `frozenset` o sus subtipos.

int `PySet_Discard`(PyObject *set, PyObject *key)

  Retorna `1` si se encuentra y se elimina, `0` si no se encuentra (no se realiza ninguna acción) y `-1` si se encuentra un error. No lanza `KeyError` por faltar claves. Lanza un `TypeError` si la key no se puede compartir. A diferencia del método Python `discard()`, esta función no convierte automáticamente conjuntos no compartibles en congelados temporales. Lanza `PyExc_SystemError` si set no es una instancia de `set` o su subtipo.

PyObject* `PySet_Pop`(PyObject *set)
  Return value: New reference.

  Retorna una nueva referencia a un objeto arbitrario en el set y elimina el objeto del set. Retorna `NULL` en caso de falla. Lanza `KeyError` si el conjunto está vacío. Lanza a `SystemError` si set no es una instancia de `set` o su subtipo.

int `PySet_Clear`(PyObject *set)

  Vacía un conjunto existente de todos los elementos.

int `PySet_ClearFreeList`()

  Borra la lista libre. Retorna el número total de artículos liberados.

  Nuevo en la versión 3.3.