collections.abc
— Classes Base Abstratas para Contêineres¶
Adicionado na versão 3.3: Anteriormente, esse módulo fazia parte do módulo collections
.
Código-fonte: Lib/_collections_abc.py
Esse módulo fornece classes base abstratas que podem ser usadas para testar se uma classe fornece uma interface específica; por exemplo, se é hasheável ou se é um mapeamento.
Um teste issubclass()
ou isinstance()
para uma interface funciona em uma das três formas.
Uma classe recém-escrita pode herdar diretamente de uma das classes base abstratas. A classe deve fornecer os métodos abstratos necessários. Os métodos mixin restantes vêm da herança e podem ser substituídos se desejado. Outros métodos podem ser adicionados conforme necessário:
class C(Sequence): # Herança direta def __init__(self): ... # Método extra não exigido pela ABC def __getitem__(self, index): ... # Método abstrato exigido def __len__(self): ... # Método abstrato exigido def count(self, value): ... # Opcionalmente substitui um método mixin
>>> issubclass(C, Sequence) True >>> isinstance(C(), Sequence) True
Classes existentes e classes embutidas podem ser registradas como “subclasses virtuais” dos ABCs. Essas classes devem definir a API completa, incluindo todos os métodos abstratos e todos os métodos mixin. Isso permite que os usuários confiem nos testes
issubclass()
ouisinstance()
para determinar se a interface completa é suportada. A exceção a essa regra é para métodos que são automaticamente inferidos do restante da API:class D: # Sem herança def __init__(self): ... # Método extra exigido pela ABC def __getitem__(self, index): ... # Método abstrato def __len__(self): ... # Método abstrato def count(self, value): ... # Método mixin def index(self, value): ... # Método mixin Sequence.register(D) # Registra ao invés de herdar
>>> issubclass(D, Sequence) True >>> isinstance(D(), Sequence) True
Neste exemplo, a classe
D
não precisa definir__contains__
,__iter__
e__reversed__
porque o operador in, a lógica iteration e a funçãoreversed()
retornam automaticamente para o uso de__getitem__
e__len__
.Algumas interfaces simples são diretamente reconhecíveis pela presença dos métodos necessários (a menos que esses métodos tenham sido definidos como
None
):class E: def __iter__(self): ... def __next__(self): ...
>>> issubclass(E, Iterable) True >>> isinstance(E(), Iterable) True
Interfaces complexas não oferecem suporte a esta última técnica porque uma interface é mais do que apenas a presença de nomes de métodos. Interfaces especificam semântica e relacionamentos entre métodos que não podem ser inferidos somente da presença de nomes de métodos específicos. Por exemplo, saber que uma classe fornece
__getitem__
,__len__
e__iter__
é insuficiente para distinguir umaSequence
de umaMapping
.
Adicionado na versão 3.9: Essas classes abstratas agora oferecem suporte a []
. Veja Tipo Generic Alias e PEP 585.
Classes Base Abstratas de Coleções¶
O módulo de coleções oferece o seguinte ABCs:
ABC |
Herda de |
Métodos abstratos |
Métodos mixin |
---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
Herdados métodos de |
||
|
Herdados métodos de |
||
|
|
||
|
Herdado |
||
|
|
||
|
Herdado |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
||
|
Notas de rodapé
Classes Base Abstrata de Coleções – Descrições Detalhadas¶
- class collections.abc.Container¶
ABC para classes que fornecem o método
__contains__()
.
- class collections.abc.Hashable¶
ABC para classes que fornecem o método
__hash__()
.
- class collections.abc.Callable¶
ABC para classes que fornecem o método
__call__()
.Veja Anotações de objetos chamáveis para detalhes sobre como usar
Callable
em anotações de tipos.
- class collections.abc.Iterable¶
ABC para classes que fornecem o método
__iter__()
.A verificação
isinstance(obj, Iterable)
detecta classes que são registradas comoIterable
ou que possuem um método__iter__()
, mas que não detecta classes que iteram com o método__getitem__()
. A única maneira confiável de determinar se um objeto é iterável é chamariter(obj)
.
- class collections.abc.Collection¶
ABC para classes de contêiner iterável de tamanho.
Adicionado na versão 3.6.
- class collections.abc.Iterator¶
ABC para classes que fornecem os métodos
__iter__()
e métodos__next__()
. Veja também a definição de iterator.
- class collections.abc.Reversible¶
ABC para classes iteráveis que também fornecem o método
__reversed__()
.Adicionado na versão 3.6.
- class collections.abc.Generator¶
ABC para classes geradores que implementam o protocolo definido em PEP 342 que estende os iteradores com os métodos
send()
,throw()
eclose()
.Consulte Anotando geradores e corrotinas para obter detalhes sobre como usar
Generator
em anotações de tipos.Adicionado na versão 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
- class collections.abc.ByteString¶
ABCs para sequências somente de leitura e mutáveis.
Nota de implementação: Alguns dos métodos mixin, como
__iter__()
,__reversed__()
eindex()
, fazem chamadas repetidas para o método subjacente__getitem__()
. Consequentemente, se__getitem__()
for implementado com velocidade de acesso constante, os métodos mixin terão desempenho linear; no entanto se o método subjacente for linear (como seria com uma lista encadeada), os mixins terão desempenho quadrático e provavelmente precisará ser substituído.Alterado na versão 3.5: O método index() adicionou suporte para os argumentos stop e start.
Deprecated since version 3.12, will be removed in version 3.14: A ABC
ByteString
foi descontinuada. Para uso em tipagem, prefira uma união, comobytes | bytearray
, oucollections.abc.Buffer
. Para uso como uma ABC, prefiraSequence
oucollections.abc.Buffer
.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABCs para conjuntos somente leitura e mutáveis.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABCs para somente leitura e mutável mappings.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABCs para mapeamento, itens, chaves e valores views.
- class collections.abc.Awaitable¶
ABC para objetos aguardáveis, que podem ser usados em expressões de
await
. Implementações personalizadas devem fornecer o método__await__()
.Objetos e instâncias de corrotina da ABC
Coroutine
são todas instâncias dessa ABC.Nota
No CPython, as corrotinas baseados em gerador (geradores decorados com
@types.coroutine
) são aguardáveis, embora não possuam o método__await__()
. Usarisinstance(gencoro, Awaitable)
para eles retornaráFalse
. Useinspect.isawaitable()
para detectá-los.Adicionado na versão 3.5.
- class collections.abc.Coroutine¶
ABC para classes compatíveis com corrotina. Eles implementam os seguintes métodos, definidos em Objetos corrotina:
send()
,throw()
, eclose()
. Implementações personalizadas também devem implementar__await__()
. Todas as instânciasCoroutine
também são instâncias deAwaitable
.Nota
No CPython, as corrotinas baseados em gerador (geradores decorados com
@types.coroutine
) são aguardáveis, embora não possuam o método__await__()
. Usarisinstance(gencoro, Coroutine)
para eles retornaráFalse
. Useinspect.isawaitable()
para detectá-los.Consulte Anotando geradores e corrotinas para obter detalhes sobre como usar
Coroutine
em anotações de tipos. A variância e a ordem dos parâmetros de tipo correspondem às deGenerator
.Adicionado na versão 3.5.
- class collections.abc.AsyncIterable¶
ABC para classes que fornecem um método
__aiter__
. Veja também a definição de iterável assíncrono.Adicionado na versão 3.5.
- class collections.abc.AsyncIterator¶
ABC para classes que fornecem os métodos
__aiter__
e__anext__
. Veja também a definição de iterador assíncrono.Adicionado na versão 3.5.
- class collections.abc.AsyncGenerator¶
ABC para classes de gerador assíncrono que implementam o protocolo definido em PEP 525 e PEP 492.
Consulte Anotando geradores e corrotinas para obter detalhes sobre como usar
AsyncGenerator
em anotações de tipos.Adicionado na versão 3.6.
- class collections.abc.Buffer¶
ABC para classes que fornecem o método
__buffer__()
, implementando o protocolo buffer. Veja PEP 688.Adicionado na versão 3.12.
Exemplos e receitas¶
ABCs nos permitem perguntar a classes ou instâncias se elas fornecem funcionalidades específicas, por exemplo:
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Vários ABCs também são também úteis como mixins que facilitam o desenvolvimento de classes que suportam APIs de contêiner. Por exemplo, para escrever uma classe que suporte toda a API Set
, é necessário fornecer apenas os três métodos abstratos subjacentes: __contains__()
, __iter__()
, e __len__()
. O ABC fornece os métodos restantes, como __and__()
e isdisjoint()
:
class ListBasedSet(collections.abc.Set):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
def __iter__(self):
return iter(self.elements)
def __contains__(self, value):
return value in self.elements
def __len__(self):
return len(self.elements)
s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2 # O método __and__() é automaticamente suportado
Notas sobre o uso de Set
e MutableSet
como um mixin:
Como algumas operações de conjunto criam novos conjuntos, os métodos de mixin padrão precisam de uma maneira de criar novas instâncias a partir de um iterável. Supõe-se que a classe construtor tenha uma assinatura no formato
ClassName(iterable)
. Essa suposição é fatorada em umclassmethod
interno chamado_from_iterable()
que chamacls(iterable)
para produzir um novo conjunto. Se o mixinSet
estiver sendo usado em uma classe com uma assinatura de construtor diferente, você precisará substituir_from_iterable()
por um método de classe ou um método regular que possa construir novas instâncias a partir de um argumento iterável.Para substituir as comparações (presumivelmente para velocidade, já que a semântica é fixa), redefina
__le__()
e__ge__()
, então as outras operações seguirão o exemplo automaticamente.O mixin
Set
fornece um método_hash()
para calcular um valor de hash para o conjunto; no entanto,__hash__()
não é definido porque nem todos os conjuntos são hasheáveis ou imutáveis. Para adicionar hasheabilidade em conjuntos usando mixin, herde de ambosSet()
eHashable()
, e então defina__hash__ = Set._hash
.
Ver também
OrderedSet receita para um exemplo baseado em
MutableSet
.Para mais informações sobre ABCs, consulte o módulo
abc
e PEP 3119.