Colecciones Avanzadas en Python: UserDict, namedtuple y más

Clase 28 de 49Curso Práctico de Python: Creación de un CRUD

El módulo collections nos brinda un conjunto de objetos primitivos que nos permiten extender el comportamiento de las built-in collections que poseé Python y nos otorga estructuras de datos adicionales. Por ejemplo, si queremos extender el comportamiento de un diccionario, podemos extender la clase UserDict; para el caso de una lista, extendemos UserList; y para el caso de strings, utilizamos UserString.

Por ejemplo, si queremos tener el comportamiento de un diccionario podemos escribir el siguiente código:

class SecretDict(collections.UserDict): def _password_is_valid(self, password): def _get_item(self, key): def __getitem__(self, key): password, key = key.split(:) if self._password_is_valid(password): return self._get_item(key) return None my_secret_dict = SecretDict(...) my_secret_dict[‘some_password:some_key’] # si el password es válido, regresa el valor

Otra estructura de datos que vale la pena analizar, es namedtuple. Hasta ahora, has utilizado tuples que permiten acceder a sus valores a través de índices. Sin embargo, en ocasiones es importante poder nombrar elementos (en vez de utilizar posiciones) para acceder a valores y no queremos crear una clase ya que únicamente necesitamos un contenedor de valores y no comportamiento.

Coffee = collections.NamedTuple(‘Coffee’, (‘size’, ‘bean’, ‘price’)) def get_coffee(coffee_type): If coffee_type == ‘houseblend’: return Coffee(‘large’, ‘premium’, 10)

El módulo collections también nos ofrece otros primitivos que tienen la labor de facilitarnos la creación y manipulación de colecciones en Python. Por ejemplo, Counter nos permite contar de manera eficiente ocurrencias en cualquier iterable; OrderedDict nos permite crear diccionarios que poseen un orden explícito; deque nos permite crear filas (para pilas podemos utilizar la lista).

En conclusión, el módulo collections es una gran fuente de utilerías que nos permiten escribir código más “pythonico” y más eficiente.