14.1 Userlist, Userdict E Userstring
As estruturas de dados padrão do Python são de grande valia e muito utilizadas na linguagem, mas existem momentos em que precisamos de funcionalidades extras que são comuns de projeto para projeto. Nesse sentido, surge o módulo collections , pra acrescentar essas funcionalidades.
Por exemplo, no livro Python Fluente de Luciano Ramalho, é apresentado um exemplo em que precisamos acrescentar funcionalidades extras:
“Um caso de uso concreto é o projeto Pingo.io (http://www.pingo.io/docs/), em que uma placa programável com pinos GPIO (por exemplo, Raspberry Pi ou Arduino) é representada por um objeto board com um atributo board.pins ; esse atributo contém um mapeamento das localizações físicas dos pinos para objetos que representam os pinos. A localização física pode ser um número ou uma string como “A0” ou “P912”. Por questões de consistência, é desejável que todas as chaves com board.pins sejam _strings, mas é conveniente que a consulta a my_arduino.pin[13] também funcione de modo que programadores iniciantes não tenham problemas quando quiserem fazer piscar o LED no pino 13 de seus Arduinos.”
Precisamos usar índices que são strings, portanto, um dicionário. Além disso, nosso dicionário poderia apenas aceitar strings como chaves para este objetivo específico. Para não tratar isso durante a execução de nosso programa, podemos criar uma classe que tenha o comportamento de um dicionário com essa característica específica.
Para isso, criamos uma classe que herda de uma classe chamada UserDict do pacote
collections :
class MeuDicionario(UserDict): passA classe UserDict não herda de dict , mas simula um dicionário. A UserDict possui uma instância de dict interna chamada data , que armazena os itens propriamente ditos.
Criar subclasses de tipos embutidos como dict ou list diretamente é propenso a erros, porque seus métodos geralmente ignoram as versões sobrescritas. Além de que cada implementação pode se comportar de maneira diferente. O fato de herdarmos de UserDict e não diretamente de dict é para evitarmos esses problemas.
Criando a classe desta maneira, temos uma classe nossa que funciona como um dicionário. Mas não faz sentido criá-la sem acrescentar funcionalidades, já que o Python já possui essa estrutura pronta que é o dict .
Vamos criar nosso dicionário, de modo que só aceite chaves como strings e vai representar os pinos da placa do Rasbperry Pi, por exemplo:
from collections import UserDict class Pins(UserDict):
python
def contains (self, key): return str(key) in self.keys()
def setitem (self, key, value):
self.data[str(key)] = value
Note que a sobrescrita de setitem
testar essa classe:
garante que a chave sempre será uma string . Podemos
java
if name == ' main ': pins = Pins(one=1) print(pins)pins[3] =
lista = [1, 2, 3]pins[lista] = 2 print(pins)
Perceba que quando imprimimos o dicionário, todas suas chaves são strings .