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.
