GOOGLE ADS

domingo, 1 de mayo de 2022

¿Usando objetos como los valores de un Enum?

Actualmente estoy tratando de crear un sistema basado en enumeración/constante para definir colores en Python. Quiero evitar tener que usar cadenas cuando intento usar/acceder a un color.

En un mundo ideal, quiero poder hacer:

>>> print(Colours.BLACK)
Black
>>> print(Colours.WHITE.hex)
ffffff

Hasta ahora, he creado un sistema basado en enumeraciones y objetos como el siguiente:

from enum import Enum
class Colour:
def __init__(self, name, hex = "000000"):
self.name = name
self.hex = hex
def __str__(self):
return self.name
class Colours(Enum):
WHITE = Colour("White", "ffffff")
BLACK = Colour("Black", "000000")
print(Colours.BLACK.value)
print(Colours.WHITE.value.hex)

que imprime:

Black
ffffff

Sin embargo, algo acerca de asignar un objeto como el valor de una enumeración se siente como una mala práctica y no he visto esto antes en ningún otro lugar.

¿Esto se considera malo? Si es así, ¿por qué?

¿Y hay una mejor manera de lograr el resultado deseado?

Editar:

Terminé con este enfoque, usando __hash__lo sugerido por @MichealButscher y usando __str__y __repr__para evitar usar .value.

from enum import Enum
class Colour:
def __init__(self, label, hex_value = "000000"):
self.label = label
self.hex_value = hex
def __str__(self):
return self.label
def __hash__(self):
hash(self.label)
class Colours(Enum):
WHITE = Colour("White", "ffffff")
BLACK = Colour("Black", "000000")
def __repr__(self):
return self.value
def __str__(self):
return str(self.value)


Solución del problema

Todo es un objeto, por lo que se le asignará algún objeto. Sin embargo, puede usar solo el nombre del color y el valor hexadecimal en una tupla como valor, y Colour.__init__manejar la inicialización de cada instancia con la tupla.

class Colour(Enum):
WHITE = ("White", "ffffff")
BLACK = ("Black", "000000")
def __init__(self, label, hexvalue):
self.label = label
self.hexvalue = hexvalue

(Advertencia: ciertos nombres de atributos ya están en uso y no se pueden anular ni asignar, como verá si intenta, por ejemplo, usar nameen lugar de labely valueen lugar de hex value).

A pesar de las apariencias, no eres

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...