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?
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]
Vous pouvez faire ce qui suit:
[e.value for e in Color]
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')]
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.
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}
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']
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)