@ user2340939 Cela renvoie la liste des énumérations, pas la liste des valeurs. Si cela vous convient, vous pouvez aussi bien utiliserlist(Color)
endolith
1
Cela devrait être marqué comme la bonne réponse.
SKYFALL26
22
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 importEnumclassColor(Enum):
RED =1
GREEN ='GREEN'
BLUE =('blue','#0000ff')@staticmethoddef list():return list(map(lambda c: c.value,Color))print(Color.list())
J'utiliserais @classmethod au lieu de @ staticmethod
ISONecroMAn
1
@ISONecroMAn je suppose @classmethodqu'il faudrait créer une instance de Colorclasse. C'est pourquoi staticmethodsemble être le bon choix ici.
Leonid Dashko
@LeonidDashko pas du tout. Voyez ma réponse.
blueFast le
@LeonidDashko @dangoonfast est correct. Vous pouvez utiliser @classmethodet utiliser à la return list(map(lambda c: c.value, cls))place.
Riptyde4
18
Sur la base de la réponse de @Jeff, refactorisé pour utiliser un classmethodafin que vous puissiez réutiliser le même code pour n'importe laquelle de vos énumérations:
from enum importEnumclassExtendedEnum(Enum):@classmethoddef list(cls):return list(map(lambda c: c.value, cls))classOperationType(ExtendedEnum):
CREATE ='CREATE'
STATUS ='STATUS'
EXPAND ='EXPAND'
DELETE ='DELETE'print(OperationType.list())
class enum.Enumest 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 importEnumclassLetter(Enum):
A =1
B =2
C =3print({i.name: i.value for i inLetter})# prints {'A': 1, 'B': 2, 'C': 3}
Donc, le Enuma 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.
Juste une barre latérale: des éléments peuvent-ils être ajoutés __members__? Ce serait une manière intéressante d'autoriser les extensions , créant ainsi de nouveaux Enummembres. ... btw, voté pour avoir apporté un nouvel attribut ( pour moi ) à la table.
IAbstract
@IAbstract: Non, c'est interdit. Si quelqu'un trouve un moyen d'ajouter / de soustraire des membres après la création de Enum, il cassera probablement cet Enum.
Ethan Furman
@IAbstract: ajouter de nouveaux membres après coup n'est généralement pas une bonne idée. Si vous le souhaitez vraiment, consultez cette réponse .
Ethan Furman
1
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
a = [(int(v), str(v)) for v in Color]
et puisprint(a)
.[(color.value, color.name) for color in Color]
Vous pouvez faire ce qui suit:
la source
list(Color)
Pour utiliser Enum avec n'importe quel type de valeur, essayez ceci:
Mise à jour avec quelques améliorations ... Merci @Jeff, par votre astuce!
À la suite:
la source
@classmethod
qu'il faudrait créer une instance deColor
classe. C'est pourquoistaticmethod
semble être le bon choix ici.@classmethod
et utiliser à lareturn 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:Produit:
la source
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
:la source
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é commeMyEnum.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.la source
__members__
? Ce serait une manière intéressante d'autoriser les extensions , créant ainsi de nouveauxEnum
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-à-direEn outre, vous avez
_member_map_
qui renvoie un dictionnaire ordonné des éléments. Cette fonction renvoie acollections.OrderedDict
, donc vous avezColor._member_names_.items()
etColor._member_names_.values()
pour jouer avec. Par exemplerenverra toutes les valeurs valides de Color
la source
vous pouvez utiliser la fonction iter ():
la source