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]
sous forme de liste quelque part. Comment puis-je atteindre cet objectif?
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]
sous forme de liste quelque part. Comment puis-je atteindre cet objectif?
Réponses:
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 entiers:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
a = [(int(v), str(v)) for v in Color]
et puis print(a)
.
[(color.value, color.name) for color in Color]
Pour utiliser Enum avec n'importe quel type de valeur, essayez ceci:
Mise à jour avec quelques améliorations ... Merci @Jeff, par votre astuce!
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')]
@classmethod
qu'il faudrait créer une instance de Color
classe. C'est pourquoi staticmethod
semble être le bon choix ici.
@classmethod
et utiliser à la return list(map(lambda c: c.value, cls))
place.
Sur la base de la réponse de @Jeff, refactorisé pour utiliser un classmethod
afin que vous puissiez réutiliser le même code pour n'importe laquelle de vos énumérations:
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']
class enum.Enum
est une classe qui résout tous vos besoins d'énumération, il vous suffit donc d'en hériter et d'ajouter vos propres champs. Ensuite, tout ce que vous avez à faire est d'appeler simplement 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}
Donc, le 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 __members__
dictionnaire pourrait être utile si vous vouliez y insérer des éléments de manière dynamique ... dans une situation folle.
[EDIT]
Apparemment, ce __members__
n'est pas un dictionnaire, mais un proxy de carte. Ce qui signifie que vous ne pouvez pas facilement y ajouter d'éléments.
Vous pouvez cependant faire des trucs bizarres comme MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, et ensuite vous pouvez utiliser la nouvelle clé comme MyEnum.new_key
.... mais ce n'est qu'un détail d'implémentation, et ne devrait pas être joué avec. La magie noire est payée avec d'énormes coûts de maintenance.
__members__
? Ce serait une manière intéressante d'autoriser les extensions , créant ainsi de nouveaux Enum
membres. ... btw, voté pour avoir apporté un nouvel attribut ( pour moi ) à la table.
Utilisez _member_names_
pour un résultat rapide et facile s'il ne s'agit que des noms, c'est-à-dire
Color._member_names_
En outre, vous avez _member_map_
qui renvoie un dictionnaire ordonné des éléments. Cette fonction renvoie a collections.OrderedDict
, donc vous avez Color._member_names_.items()
et Color._member_names_.values()
pour jouer avec. Par exemple
return list(map(lambda x: x.value, Color._member_map_.values()))
renverra toutes les valeurs valides de Color
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)