collections.abc
— Classes Base Abstratas para Contêineres¶
Novo na versão 3.3: Anteriormente, esse módulo fazia parte do módulo collections
.
Código-fonte: Lib/_collections_abc.py
This module provides abstract base classes that can be used to test whether a class provides a particular interface; for example, whether it is hashable or whether it is a mapping.
An issubclass()
or isinstance()
test for an interface works in one
of three ways.
1) A newly written class can inherit directly from one of the abstract base classes. The class must supply the required abstract methods. The remaining mixin methods come from inheritance and can be overridden if desired. Other methods may be added as needed:
class C(Sequence): # Direct inheritance
def __init__(self): ... # Extra method not required by the ABC
def __getitem__(self, index): ... # Required abstract method
def __len__(self): ... # Required abstract method
def count(self, value): ... # Optionally override a mixin method
>>> issubclass(C, Sequence)
True
>>> isinstance(C(), Sequence)
True
2) Existing classes and built-in classes can be registered as “virtual
subclasses” of the ABCs. Those classes should define the full API
including all of the abstract methods and all of the mixin methods.
This lets users rely on issubclass()
or isinstance()
tests
to determine whether the full interface is supported. The exception to
this rule is for methods that are automatically inferred from the rest
of the API:
class D: # No inheritance
def __init__(self): ... # Extra method not required by the ABC
def __getitem__(self, index): ... # Abstract method
def __len__(self): ... # Abstract method
def count(self, value): ... # Mixin method
def index(self, value): ... # Mixin method
Sequence.register(D) # Register instead of inherit
>>> issubclass(D, Sequence)
True
>>> isinstance(D(), Sequence)
True
In this example, class D
does not need to define
__contains__
, __iter__
, and __reversed__
because the
in-operator, the iteration
logic, and the reversed()
function automatically fall back to
using __getitem__
and __len__
.
3) Some simple interfaces are directly recognizable by the presence of
the required methods (unless those methods have been set to
None
):
class E:
def __iter__(self): ...
def __next__(next): ...
>>> issubclass(E, Iterable)
True
>>> isinstance(E(), Iterable)
True
Complex interfaces do not support this last technique because an
interface is more than just the presence of method names. Interfaces
specify semantics and relationships between methods that cannot be
inferred solely from the presence of specific method names. For
example, knowing that a class supplies __getitem__
, __len__
, and
__iter__
is insufficient for distinguishing a Sequence
from
a Mapping
.
Novo na versão 3.9: These abstract classes now support []
. See Tipo Generic Alias
and 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 |
---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
Herdado os métodos da |
||
|
Herdado |
||
|
|
||
|
Herdado |
||
|
|
||
|
Herdado |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
Notas de rodapé
- 1(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
These ABCs override
object.__subclasshook__()
to support testing an interface by verifying the required methods are present and have not been set toNone
. This only works for simple interfaces. More complex interfaces require registration or direct subclassing.- 2
Checking
isinstance(obj, Iterable)
detects classes that are registered asIterable
or that have an__iter__()
method, but it does not detect classes that iterate with the__getitem__()
method. The only reliable way to determine whether an object is iterable is to calliter(obj)
.
Collections Abstract Base Classes – Detailed Descriptions¶
-
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.
Sized
¶ ABC para classes que fornecem o método
__len__()
.
-
class
collections.abc.
Callable
¶ ABC para classes que fornecem o método
__call__()
.
-
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.
Novo 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__()
.Novo 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()
. Veja também a definição de gerador.Novo 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.
-
class
collections.abc.
Set
¶ -
class
collections.abc.
MutableSet
¶ ABCs para sets somente leitura e mutável.
-
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 (geradoras decorados com
types.coroutine()
ouasyncio.coroutine()
) são awaitables, embora não possuam o método__await__()
. Usarisinstance(gencoro, Awaitable)
para eles retornaráFalse
. Useinspect.isawaitable()
para detectá-los.Novo 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
. Veja também a definição de corrotina.Nota
Em CPython, as corrotinas baseadas em gerador (geradores decorados com
types.coroutine()
ouasyncio.coroutine()
) são awaitables, embora não possuam o método__await__()
. Usarisinstance(gencoro, Coroutine)
para eles retornaráFalse
. Useinspect.isawaitable()
para detectá-los.Novo na versão 3.5.
-
class
collections.abc.
AsyncIterable
¶ ABC para classes que fornecem o método
__aiter__
. Veja também a definição de iterável assíncrono.Novo 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.Novo na versão 3.5.
Exemplos e receitas¶
ABCs allow us to ask classes or instances if they provide particular functionality, for example:
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 # The __and__() method is supported automatically
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 uma iterável. Supõe-se que a classe construtor tenha uma assinatura no formato
ClassName(iterable)
. Essa suposição é fatorada em um método de classe 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.The
Set
mixin provides a_hash()
method to compute a hash value for the set; however,__hash__()
is not defined because not all sets are hashable or immutable. To add set hashability using mixins, inherit from bothSet()
andHashable()
, then define__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.