@ user2340939 Eso devuelve la lista de enumeraciones, no la lista de valores. Si está de acuerdo con eso, también podría usarlist(Color)
endolito
1
Esto debe marcarse como la respuesta correcta.
SKYFALL26
22
Para usar Enum con cualquier tipo de valor, intente esto:
actualizado con algunas mejoras ... ¡Gracias @Jeff, por su consejo!
from enum importEnumclassColor(Enum):
RED =1
GREEN ='GREEN'
BLUE =('blue','#0000ff')@staticmethoddef list():return list(map(lambda c: c.value,Color))print(Color.list())
La clase enum.Enumes una clase que resuelve todas sus necesidades de enumeración, por lo que solo necesita heredar de ella y agregar sus propios campos. Luego, a partir de entonces, todo lo que necesita hacer es llamar a sus atributos: name& value:
from enum importEnumclassLetter(Enum):
A =1
B =2
C =3print({i.name: i.value for i inLetter})# prints {'A': 1, 'B': 2, 'C': 3}
Entonces el Enumtiene un __members__dict. La solución que propuso @ozgur es realmente la mejor, pero puedes hacer esto, que hace lo mismo, con más trabajo
[color.value for color_name, color in Color.__members__.items()]
El __members__diccionario podría ser útil si desea insertar cosas dinámicamente en él ... en una situación loca.
[EDITAR]
Aparentemente __members__no es un diccionario, sino un proxy de mapa. Lo que significa que no puede agregarle elementos fácilmente.
Sin embargo, puede hacer cosas extrañas como MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', y luego puede usar la nueva clave como MyEnum.new_key... pero esto es solo un detalle de implementación, y no debe jugarse con él. La magia negra se paga con enormes costos de mantenimiento.
Solo una barra lateral: ¿se pueden agregar elementos __members__? Sería una forma interesante de permitir extensiones creando así nuevos Enummiembros. ... por cierto, votó por traer un nuevo atributo ( para mí ) a la tabla.
IAbstract
@IAbstract: No, eso no está permitido. Si alguien descubre una forma de sumar / restar miembros después de que se crea la enumeración, probablemente romperá esa enumeración.
Ethan Furman
@IAbstract: Agregar nuevos miembros después de que el hecho no sea una buena idea. Si realmente quieres, mira esta respuesta .
Ethan Furman
1
Úselo _member_names_para obtener un resultado rápido y sencillo si solo se trata de los nombres, es decir
Color._member_names_
Además, tiene _member_map_que devuelve un diccionario ordenado de los elementos. Esta función devuelve a collections.OrderedDict, por lo que tiene Color._member_names_.items()y Color._member_names_.values()para jugar. P.ej
a = [(int(v), str(v)) for v in Color]
Y luegoprint(a)
.[(color.value, color.name) for color in Color]
Puedes hacer lo siguiente:
fuente
list(Color)
Para usar Enum con cualquier tipo de valor, intente esto:
actualizado con algunas mejoras ... ¡Gracias @Jeff, por su consejo!
Como resultado:
fuente
@classmethod
que requeriría crear una instancia deColor
clase. Es por eso questaticmethod
parece ser la elección correcta aquí.@classmethod
y usarreturn list(map(lambda c: c.value, cls))
en su lugar.Basado en la respuesta de @Jeff, refactorizado para usar a
classmethod
para que pueda reutilizar el mismo código para cualquiera de sus enumeraciones:Produce:
fuente
La clase
enum.Enum
es una clase que resuelve todas sus necesidades de enumeración, por lo que solo necesita heredar de ella y agregar sus propios campos. Luego, a partir de entonces, todo lo que necesita hacer es llamar a sus atributos:name
&value
:fuente
Entonces el
Enum
tiene un__members__
dict. La solución que propuso @ozgur es realmente la mejor, pero puedes hacer esto, que hace lo mismo, con más trabajo[color.value for color_name, color in Color.__members__.items()]
El
__members__
diccionario podría ser útil si desea insertar cosas dinámicamente en él ... en una situación loca.[EDITAR] Aparentemente
__members__
no es un diccionario, sino un proxy de mapa. Lo que significa que no puede agregarle elementos fácilmente.Sin embargo, puede hacer cosas extrañas como
MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, y luego puede usar la nueva clave comoMyEnum.new_key
... pero esto es solo un detalle de implementación, y no debe jugarse con él. La magia negra se paga con enormes costos de mantenimiento.fuente
__members__
? Sería una forma interesante de permitir extensiones creando así nuevosEnum
miembros. ... por cierto, votó por traer un nuevo atributo ( para mí ) a la tabla.Úselo
_member_names_
para obtener un resultado rápido y sencillo si solo se trata de los nombres, es decirAdemás, tiene
_member_map_
que devuelve un diccionario ordenado de los elementos. Esta función devuelve acollections.OrderedDict
, por lo que tieneColor._member_names_.items()
yColor._member_names_.values()
para jugar. P.ejdevolverá todos los valores válidos de Color
fuente
puedes usar la función iter ():
fuente