Estoy usando la biblioteca Enum4 para crear una clase de enumeración de la siguiente manera:
class Color(Enum):
RED = 1
BLUE = 2
quiero imprimir [1, 2]
como una lista en alguna parte. ¿Cómo puedo conseguir esto?
usuario1159517
Estoy usando la biblioteca Enum4 para crear una clase de enumeración de la siguiente manera:
class Color(Enum):
RED = 1
BLUE = 2
quiero imprimir [1, 2]
como una lista en alguna parte. ¿Cómo puedo conseguir esto?
Puedes hacer lo siguiente:
[e.value for e in Color]
Sorprendentemente complicado para python verificar si un valor está en la enumeración, if foo in [e.value for e in Color]
– correr_la_carrera
17/09/2021 a las 17:09
@run_the_race Esto no es bonito pero es más corto: if foo in e.__members__.values()
–Paul Bissex
29 oct 2021 a las 19:07
@ori tu ejemplo no tiene sentido porque fallará si 1
no está dentro Color
. Yendo de esta manera podrías hacer try: Color(1) except ValueError: ...
que en realidad es muy pitónico
– Mickael V.
14 de diciembre de 2021 a las 22:46
@PaulBissex tu ejemplo no funciona. e.__members__.values()
devuelve instancias de los objetos de enumeración, no sus valores.
– Jugdish
29 de mayo a las 19:26
No es necesario iterar, sigue esta respuesta stackoverflow.com/a/60763091/2582581
– Martillo Salvaje
15 de junio a las 17:14
Basado en la respuesta de @Jeff, refactorizado para usar un classmethod
para que pueda reutilizar el mismo código para cualquiera de sus enumeraciones:
from enum import Enum
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return list(map(lambda c: c.value, cls))
class OperationType(ExtendedEnum):
CREATE = 'CREATE'
STATUS = 'STATUS'
EXPAND = 'EXPAND'
DELETE = 'DELETE'
print(OperationType.list())
Produce:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
Esta es una respuesta muy pitónica y elegante. Gracias.
– Mikko Ohtamaa
20 de enero de 2021 a las 13:29
¡Hermoso! He estado tratando de hacer exactamente esto durante aproximadamente una hora, pero no entendí la necesidad del método de clase. Estaba intentando simplemente crear una subclase y agregar un atributo de propiedad, pero no pude obtener super().__init__() para pasar correctamente los argumentos a Enum. ¡Gracias!
–Jesse Reich
21 oct 2021 a las 18:37
¿Por qué hacer las cosas más confusas con un mapa? Guido quería eliminarlos porque puedes hacer lo mismo con los generadores de forma más clara. [c.value for c in cls]
es la sintaxis preferida en Python. (No importa aquí, pero un beneficio es evitar las llamadas lambda adicionales por elemento y la sobrecarga del mapa). O solo el incorporado Enum._member_names_
.
– Trevor Bruto
14 de junio a las 6:48
Puedes usar IntEnum:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
Para obtener una lista de los enteros:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
Utiliza uno de terceros. Pero también dice que tiene intenum
– Marcin
07/04/2015 a las 23:52
¿Cómo puedo imprimir como [(1,’RED’), (2, ‘BLUE’)]
– usuario1159517
8 de abril de 2015 a las 1:11
¿Qué pasa con esto? a = [(int(v), str(v)) for v in Color]
y entonces print(a)
.
– Marcin
8 de abril de 2015 a las 2:37
Qué tal esto: [(color.value, color.name) for color in Color]
– vlad-ardelean
26/02/2016 a las 16:00
El comentario de @vlad-ardelean es el mejor y más pitónico. Ese es el uso idiomático del tipo Enum, elegante y eminentemente legible.
– viajero del crepúsculo
22 de diciembre de 2016 a las 22:56
EliuX
Usar _member_names_
para un resultado rápido y fácil si son solo los nombres, es decir
Color._member_names_
Además, tienes _member_map_
que devuelve un diccionario ordenado de los elementos. Esta función devuelve un collections.OrderedDict
así que tienes Color._member_map_.items()
y Color._member_map_.values()
jugar con. P.ej
return list(map(lambda x: x.value, Color._member_map_.values()))
devolverá todos los valores válidos de Color
jeff
Para usar Enum con cualquier tipo de valor, intente esto:
Actualizado con algunas mejoras… ¡Gracias @Jeff, por tu sugerencia!
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 'GREEN'
BLUE = ('blue', '#0000ff')
@staticmethod
def list():
return list(map(lambda c: c.value, Color))
print(Color.list())
Como resultado:
[1, 'GREEN', ('blue', '#0000ff')]
Usaría @classmethod en lugar de @ staticmethod
– ISONecroMAN
17 de febrero de 2018 a las 18:12
@ISONecroMAn supongo @classmethod
requeriría crear una instancia de Color
clase. Es por eso staticmethod
parece ser la elección correcta aquí.
– Leonid Dashko
1 de diciembre de 2018 a las 18:22
@LeonidDashko para nada. Mira mi respuesta.
– azul rápido
28 de febrero de 2019 a las 5:59
@LeonidDashko @dangoonfast es correcto. Puedes usar @classmethod
y use return list(map(lambda c: c.value, cls))
en cambio.
– Riptyde4
21 de noviembre de 2019 a las 23:31
Si tiene tantos valores Enum que la velocidad es más importante que la legibilidad aquí, hay algo más mal…
– Susana
6 de noviembre de 2020 a las 14:21
clase enum.Enum
es una clase que resuelve todas sus necesidades de enumeración, por lo que solo necesita heredarla y agregar sus propios campos. Luego, a partir de ese momento, todo lo que necesita hacer es simplemente llamar a sus atributos: name
& value
:
from enum import Enum
class Letter(Enum):
A = 1
B = 2
C = 3
print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}
Usaría @classmethod en lugar de @ staticmethod
– ISONecroMAN
17 de febrero de 2018 a las 18:12
@ISONecroMAn supongo @classmethod
requeriría crear una instancia de Color
clase. Es por eso staticmethod
parece ser la elección correcta aquí.
– Leonid Dashko
1 de diciembre de 2018 a las 18:22
@LeonidDashko para nada. Mira mi respuesta.
– azul rápido
28 de febrero de 2019 a las 5:59
@LeonidDashko @dangoonfast es correcto. Puedes usar @classmethod
y use return list(map(lambda c: c.value, cls))
en cambio.
– Riptyde4
21 de noviembre de 2019 a las 23:31
Si tiene tantos valores Enum que la velocidad es más importante que la legibilidad aquí, hay algo más mal…
– Susana
6 de noviembre de 2020 a las 14:21
Usando un classmethod
con __members__
:
class RoleNames(str, Enum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
>>> role_names = RoleNames.list_roles()
>>> print(role_names)
o si tienes varios Enum
clases y desea abstraer la classmethod
:
class BaseEnum(Enum):
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
class RoleNames(str, BaseEnum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
class PermissionNames(str, BaseEnum):
READ = "updated_at"
WRITE = "sort_by"
READ_WRITE = "sort_order"