¿Cómo obtener todos los valores de la clase de enumeración de python?

5 minutos de lectura

avatar de usuario
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

avatar de usuario
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.OrderedDictasí 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

avatar de usuario
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"

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad