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 name
en lugar de label
y value
en lugar de hex value
).
A pesar de las apariencias, no eres
No hay comentarios.:
Publicar un comentario