14.3 Collections Abc
O módulo collections.abc fornece classes abstratas que podem ser usadas para testar se uma classe fornece uma interface específica. Por exemplo, se ela é iterável ou não.
Imagine que o banco nos entregou um arquivo com vários funcionários e pediu que calculássemos a bonificação de cada um deles. Precisamos acrescentar este arquivo em nossa aplicação para iniciar a leitura.
Conteúdo do arquivo funcionarios.txt:
João,111111111-11,2500.0 Jose,222222222-22,3500.0 Maria,333333333-33,4000.0 Pedro,444444444-44,2500.0 Mauro,555555555-55,1700.0 Denise,666666666-66,3000.0 Tomas,777777777-77,4200.0
Cada linha do arquivo representa um Funcionario com seus atributos separados por vírgula. Este arquivo está no padrão Comma-separated-values, também conhecido como csv e são comumente usados. O Python dá suporte de leitura para este tipo de arquivo. Assim, vamos acrescentar o módulo
csv , que vai ajudar na tarefa de ler o arquivo:
import csvarquivo = open(‘funcionarios.txt’, ‘r’) leitor = csv.reader(arquivo)
for linha in leitor: print(linha)arquivo.close()
O programa acima abre um arquivo e um leitor do módulo csv , o reader - recebe o arquivo como parâmetro e devolve um leitor que vai ler linha a linha e guardar seu conteúdo. Podemos iterar sobre este leitor e pedir para imprimir o conteúdo de cada linha - que é exatamente o que é feito no laço for. Por último, fechamos o arquivo.
A saída será:
[‘João’, ‘111111111-11’, ‘2500.0’]
[‘Jose’, ‘222222222-22’, ‘3500.0’]
[‘Maria’, ‘333333333-33’, ‘4000.0’]
[‘Pedro’, ‘444444444-44’, ‘2500.0’]
[‘Mauro’, ‘555555555-55’, ‘1700.0’]
[‘Denise’, ‘666666666-66’, ‘3000.0’]
[‘Tomas’, ‘777777777-77’, ‘4200.0’]
Repare que o reader guarda cada linha de um arquivo em uma lista, e cada valor delimitado por vírgula se torna um elemento desta lista, o que facilita o acesso aos dados.
Agora com estes dados em mãos, podemos construir nossos objetos de tipo Funcionario :
for linha in leitor:funcionario = Funcionario(linha[0], linha[1], float(linha[2]))
Mas ainda precisamos de uma estrutura para guardá-los. Vamos utilizar uma lista:
funcionarios = [] for linha in leitor:funcionario = Funcionario(linha[0], linha[1], float(linha[2])) funcionarios.append(funcionario)
Por fim, imprimimos os saldos da lista:
for f in funcionarios: print(f.salario)Acontece que nada impede, posteriormente, de inserirmos nesta lista qualquer outro objeto que não um funcionário:
funcionarios.append(‘Python’) funcionarios.append(1234) funcionarios.append(True)
A list da biblioteca padrão aceita qualquer tipo de objeto como elemento. Não queremos este
196 14.3 COLLECTIONS ABC
comportamento, já que iremos calcular a bonificação de cada um deles, onde dependendo do tipo de objetos inserido na lista, gerará erros.
O ideal é que tivéssemos uma estrutura de dados que aceitasse apenas objetos de tipo Funcionario. O módulo collections.abc fornece classes abstratas que nos ajudam a construir estruturas específicas, com características da regra de negócio da aplicação.