# Objeto Set

Esta seção detalha a API pública para os objetos `set` e `frozenset`. Qualquer funcionalidade não listada abaixo é melhor acessada usando o protocolo de objeto abstrato (incluindo `PyObject_CallMethod()`, `PyObject_RichCompareBool()`, `PyObject_Hash()`, `PyObject_Repr()`, `PyObject_IsTrue()`, `PyObject_Print()`, and `PyObject_GetIter()`) ou o protocolo abstrato de número (incluindo `PyNumber_And()`, `PyNumber_Subtract()`, `PyNumber_Or()`, `PyNumber_Xor()`, `PyNumber_InPlaceAnd()`, `PyNumber_InPlaceSubtract()`, `PyNumber_InPlaceOr()` e `PyNumber_InPlaceXor()`).

`PySetObject`

  Este subtipo de `PyObject` é usado para manter os dados internos para ambos os objetos `set` e `frozenset`. É como um `PyDictObject` em que tem um tamanho fixo para conjuntos pequenos (muito parecido com o armazenamento de tupla) e apontará para um bloco de memória de tamanho variável separado para conjuntos de tamanho médio e grande (muito parecido com lista armazenamento). Nenhum dos campos desta estrutura deve ser considerado público e está sujeito a alterações. Todo o acesso deve ser feito por meio da API documentada, em vez de manipular os valores na estrutura.

PyTypeObject `PySet_Type`

  Essa é uma instância de `PyTypeObject` representando o tipo Python `set`

PyTypeObject `PyFrozenSet_Type`

  Esta é uma instância de `PyTypeObject` representando o tipo Python `frozenset`.

As macros de verificação de tipo a seguir funcionam em ponteiros para qualquer objeto Python. Da mesma forma, as funções construtoras funcionam com qualquer objeto Python iterável.

int `PySet_Check`(PyObject *p)

  Retorna verdadeiro se p for um objeto `set` ou uma instância de um subtipo.

int `PyFrozenSet_Check`(PyObject *p)

  Retorna verdadeiro se p for um objeto `frozenset` ou uma instância de um subtipo.

int `PyAnySet_Check`(PyObject *p)

  Retorna verdadeiro se p for um objeto `set`, um objeto `frozenset` ou uma instância de um subtipo.

int `PyAnySet_CheckExact`(PyObject *p)

  Retorna verdadeiro se p for um objeto `set` ou um objeto `frozenset`, mas não uma instância de um subtipo.

int `PyFrozenSet_CheckExact`(PyObject *p)

  Retorna verdadeiro se p for um objeto `frozenset`, mas não uma instância de um subtipo.

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

  Retorna uma nova `set` contendo objetos retornados pelo iterável iterable. O iterable pode ser `NULL` para criar um novo conjunto vazio. Retorna o novo conjunto em caso de sucesso ou `NULL` em caso de falha. Levanta `TypeError` se iterable não for realmente iterável. O construtor também é útil para copiar um conjunto (`c=set(s)`).

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

  Retorna uma nova `frozenset` contendo objetos retornados pelo iterável iterable. O iterable pode ser `NULL` para criar um novo frozenset vazio. Retorna o novo conjunto em caso de sucesso ou `NULL` em caso de falha. Levanta `TypeError` se iterable não for realmente iterável.

As seguintes funções e macros estão disponíveis para instâncias de `set` ou `frozenset` ou instâncias de seus subtipos.

Py_ssize_t `PySet_Size`(PyObject *anyset)

  Retorna o comprimento de um objeto `set` ou `frozenset`. Equivalente a `len(anyset)`. Levanta um `PyExc_SystemError` se anyset não for um `set`, `frozenset`, ou uma instância de um subtipo.

Py_ssize_t `PySet_GET_SIZE`(PyObject *anyset)

  Forma macro de `PySet_Size()` sem verificação de erros.

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

  Retorna `1` se encontrado, `0` se não encontrado, e `-1` se um erro é encontrado. Ao contrário do método Python `__contains__()`, esta função não converte automaticamente conjuntos não hasheáveis em frozensets temporários. Levanta um `TypeError` se a key não for hasheável. Levanta `PyExc_SystemError` se anyset não é um `set`, `frozenset`, ou uma instância de um subtipo.

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

  Adiciona key a uma instância de `set`. Também funciona com instâncias de `frozenset` (como `PyTuple_SetItem()`, ele pode ser usado para preencher os valores de novos conjuntos de congelamentos antes que eles sejam expostos a outro código). Retorna `0` em caso de sucesso ou `-1` em caso de falha. Levanta um `TypeError` se a key não for hasheável. Levanta uma `MemoryError` se não houver espaço para crescer. Levanta uma `SystemError` se set não for uma instância de `set` ou seu subtipo.

As seguintes funções estão disponíveis para instâncias de `set` ou seus subtipos, mas não para instâncias de `frozenset` ou seus subtipos.

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

  Retorna `1` se encontrado e removido, `0` se não encontrado (nenhuma ação realizada) e `-1` se um erro for encontrado. Não levanta `KeyError` para chaves ausentes. Levanta uma `TypeError` se a key não for hasheável. Ao contrário do método Python `discard()`, esta função não converte automaticamente conjuntos não hasheáveis em frozensets temporários. Levanta `PyExc_SystemError` se set não é uma instância de `set` ou seu subtipo.

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

  Retorna uma nova referência a um objeto arbitrário no set e remove o objeto do set. Retorna `NULL` em caso de falha. Levanta `KeyError` se o conjunto estiver vazio. Levanta uma `SystemError` se set não for uma instância de `set` ou seu subtipo.

int `PySet_Clear`(PyObject *set)

  Limpa todos os elementos de um conjunto existente

int `PySet_ClearFreeList`()

  Limpe a lista livre. Retorna o número total de itens liberados.

  Novo na versão 3.3.