Named Tuples en Python

Autor: | Última modificación: 8 de marzo de 2024 | Tiempo de Lectura: 2 minutos
Temas en este post: , ,

En Python o cualquier otro lenguaje a menudo necesitamos combinar dos valores en uno solo. Por ejemplo, supongamos que necesitamos representar un punto en el plano cartesiano o los datos de un usuario provenientes de una API.

En Python, tenemos normalmente dos opciones para ello: clases y tuplas.

Las tuplas son muy sencillas, pero no son autodocumentantes, es decir, con mirar a una, no se sabe muy bien qué representa. Las clases son mucho mejores en ese sentido, pero también son más complejas y a menudo tienes que escribir mucho más código: inicializadores, getters, setters, dunders y demás.

Es decir, tenemos que optar entre un patinete y la Estrella de la Muerte. Debería de haber algo entre medias y… ¡lo hay! 

Named Tuples

Las Named Tuples son algo relativamente reciente, añadido al módulo collections, y nos proporcionan un excelente mecanismo para crear el equivalente a estructuras en Python.

La Named Tuple tendrá un nombre, una serie de atributos con tipo y nombre y viene de serie con varios dunders ya implementados por nosotros, como __repr__ o __eq__. Esto nos ahorra mucho tiempo y código comparado con una clase. Además, ocupan menos memoria.

Veamos un ejemplo de cómo usarlas.

Crear una Named Tuple

La función namedtuple nos devuelve un tipo que luego podemos usar.
import collections

Person = collections.namedtuple("Person", ['fname', 'lname', 'age', 'email'])

Ahora podemos usar el tipo Person para crear instancias:
ar = Person("Andrés", "Rodriguez", 38, "[email protected]")

Tiene su propia __repr__
Person(fname='Andrés', lname='Rodriguez', age=38, email='[email protected]')

Person es una subclase de Tuple
isinstance(ar, tuple)   # it's a subclass of tuple

Tiene longitud (len), es indexable y es “sliceable”.
len(ar)  #has a len

ar[:2]  # sliceable

ar[0]   #indexable

Person es “unpackable”

Una ventaja de las tuplas es que puedes desempaquetarlas y asignar partes de su contenido a otras variables de forma muy sencilla. También se puede hacer con las Named Tuples.

a,b,c,d = ar #unpackable

Setters automáticos

También se puede acceder a los componentes mediante setters:

ar.fname 

Inmutables

Las Named Tuples tienen otra ventaja: son inmutables por defecto, lo cual facilita mucho el evitar un montón de bugs de “alias”.

En resumidas cuentas, las Named Tuples son un gran añadido a Python y algo que deberías usar más a menudo. Probablemente muchas de las clases que utilizas se pueden sustituir por Named Tuples.