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.