Bienvenidos sean a este post, hoy hablaremos sobre un tipo de dato muy comun en muchos lenguajes pero no tanto en este.
Esto es debido a que fue ingresado en la version 3.4, veamos su defincion segun la documentacion oficial:
Una enumeración es un conjunto de nombres simbólicos (miembros) ligados a valores únicos y constantes. Dentro de una enumeración, los miembros se pueden comparar por identidad y la enumeración en sí puede ser iterada
Guido van Rossum
Para verlo en accion vamos a suponer que necesitamos trabajar en un codigo que maneje el trafico, podemos usar el siguiente codigo:
>>> ROJO = 1
>>> AMARILLO = 2
>>> VERDE = 3
>>> semaforo = (ROJO, AMARILLO, VERDE)
>>>
Primero definimos tres valores que representaran a los colores de nuestros semaforos, despues tenemos una lista para almacenar estos valores o podemos hacerlo con un diccionario:
>>> semaforo = {'ROJO': 1, 'AMARILLO': 2, 'VERDE': 3}
Si bien podemos manejarlo de ambas formas, al momento de querer utilizar estos valores puede generar unos inconvenientes, en el primer ejemplo como los valores no son constantes se pueden modificar por error y esto puede derivar en errores o en el segundo caso podemos tener el inconveniente de poder manejar la informacion de forma muy clara, veamos el mismo caso pero con Enum:
>>> from enum import Enum
>>> class semaforo(Enum):
... ROJO = 1
... AMARILLO = 2
... VERDE = 3
...
>>>
Si bien puede ser mas engorroso nos evitaremos varios inconvenientes que luego veremos, primero debemos importar de enum a nuestra clase Enum, una vez hecho crearemos una clase llamada semaforo donde le diremos que es de tipo Enum, dentro definiremos los tres colores con sus respectivos valores, tal como hicimos antes, y con nuestra clase creada podemos pasar a probar, veamos el primer ejemplo:
>>> semaforo.VERDE
<semaforo.VERDE: 3>
>>>
Si llamamos con uno de los colores nos traera la «clave» y el valor asociado, tambien nosotros podemos obtener tanto el nombre como el valor que contiene por separados veamos el siguiente ejemplo:
>>> print(semaforo.VERDE.name)
VERDE
>>> print(semaforo.VERDE.value)
3
>>>
Vemos que al utilizar los atributos name y value nos devolvera el nombre y el valor almacenado dentro del enum respectivamente, otra opcion interesante es que podemos buscarlo por valor:
>>> semaforo(3)
<semaforo.VERDE: 3>
>>>
Observen como al ingresar un valor si este existe nos devuelve el nombre al que esta asociado tal como vimos al principio, vamos a analizar lo que mencionamos con el primer ejemplo, supongamos que me equivoco y le cambio el valor a VERDE:
>>> VERDE = 5
Todo el codigo relacionado a esa lista comenzara a generar errores porque esta pensado para trabajar con el valor anterior y no con el nombre, en cambio si nosotros volvemos a verificar el valor de nuestro enum obtenemos lo siguiente:
>>> semaforo.VERDE
<semaforo.VERDE: 3>
>>>
En este caso el valor no cambio o por lo menos no se vio afectado por la modificacion externo pero si intentamos modificarlo explicitamente? Veamos que sucede con el siguiente ejemplo:
>>> semaforo.VERDE = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/enum.py", line 386, in __setattr__
raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.
>>>
Al intentar hacerlo nos devolvera un error de que no se pueden reasignar los valores, esto es debido a que enum trabaja con valores constantes y una vez creados no se pueden modificar, esto es una gran proteccion para evitar potenciales errores para cuando debemos trabajar con valores que se deben mantener constantes durante todo el codigo.
En resumen, hoy hemos visto como es enum para python, como trabaja, como se crea, como se asignan los valores, como podemos recuperarlos, tambien hemos visto uno de los beneficios mas importantes que nos provee y si bien se implemento hace poco tiempo no deja de ser una opcion mas que interesante para nosotros, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
