web-dev-qa-db-fra.com

Comment obtenir toutes les valeurs de la classe python enum?

J'utilise la bibliothèque Enum4 pour créer une classe enum comme suit:

class Color(Enum):
    RED = 1
    BLUE = 2

Je veux imprimer [1, 2] comme une liste quelque part. Comment puis-je atteindre cet objectif?

95
user1159517

Vous pouvez utiliser IntEnum :

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

Pour obtenir la liste des ints:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
28
Marcin

Vous pouvez faire ce qui suit:

[e.value for e in Color]
284
ozgur

Pour utiliser Enum avec n'importe quel type de valeur, essayez ceci:
Mis à jour avec quelques améliorations ... Merci @Jeff, par votre conseil!

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())

À la suite:

[1, 'GREEN', ('blue', '#0000ff')]
16
Jeff

Donc, la Enum a un __members__ dict. La solution proposée par @ozgur est vraiment la meilleure, mais vous pouvez le faire, ce qui fait la même chose, avec plus de travail

[color.value for color_name, color in Color.__members__.items()]

Le dictionnaire __members__ pourrait être utile si vous vouliez y insérer des éléments de manière dynamique ... dans une situation folle.

[EDIT] Apparemment, __members__ n'est pas un dictionnaire, mais un proxy cartographique. Ce qui signifie que vous ne pouvez pas facilement y ajouter des éléments.

Vous pouvez cependant faire des choses bizarres comme MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', puis vous pouvez utiliser la nouvelle clé telle que MyEnum.new_key...., mais il ne s'agit que d'un détail d'implémentation, qui ne doit pas être utilisé. La magie noire est payée avec des coûts de maintenance énormes.

5
vlad-ardelean

la classe enum.Enum est une classe qui résout tous vos besoins d'énumération. Vous devez donc en hériter et ajouter vos propres champs. Ensuite, tout ce que vous avez à faire est simplement d'appeler ses attributs: 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}
4
Meysam Azad

Basé sur la réponse de @Jeff, refactored pour utiliser un classmethod afin de pouvoir réutiliser le même code pour n'importe lequel de vos enums:

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())

Produit:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']
1
dangonfast

vous pouvez utiliser la fonction iter ():

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
0
Ali Shekari