J'ai une énumération que je définis comme ceci:
def make_enum(**enums): return type('Enum', (), enums) an_enum = make_enum(first=1, second=2)
Plus tard, j'aimerais vérifier si une valeur que j'ai prise comme paramètre dans une fonction fait partie de an_enum . Habituellement, je le ferais comme ceci
assert 1 in to_list (an_enum)
Comment puis-je convertir l'objet enum an_enum
à une liste? Si ce n'est pas possible, comment puis-je vérifier si une valeur "fait partie de l'énumération"?
3 Réponses :
Comment puis-je convertir l'objet enum an_enum en liste?
>>> getattr(an_enum, 'first') 1 >>> getattr(an_enum, '1') Traceback [...] AttributeError: type object 'Enum' has no attribute '1'Comment puis-je vérifier si une valeur "fait partie de l'énumération"?
>>> [name for name in dir(an_enum) if not name.startswith('_')] ['first', 'second']
Je suis presque sûr que OP demande une vérification de l'appartenance à la valeur enum, pas une vérification du nom
Ainsi, la version ci-dessus vous donnerait tous les attributs. Mais cela a vraiment aidé, car vous pouvez simplement changer cela en [getattr (an_enum, name) pour le nom dans le répertoire (an_enum) sinon name.startswith ('_')]
et vous obtiendrez ce que je besoin de [1, 2]
Je ne sais pas pourquoi vous définissez des énumérations comme vous le faites, il existe un moyen fonctionnel pris en charge pour le faire:
>>> en_enum(1) <Numbers.first: 1> >>> en_enum(3) ValueError: 3 is not a valid Numbers
Si cela répond à vos besoins, vous pouvez le faire
en_enum = Enum('Numbers', {'first': 1, 'second': 2})
pas réellement de contrôle d'adhésion, mais vous n'avez pas besoin de méthodes / transformateurs spéciaux
Merci beaucoup pour la suggestion. Je pense que je vais rester avec [getattr (an_enum, name) for name in dir (an_enum) sinon name.startswith ('_')]
, mais cette façon d'écrire les énumérations est beaucoup plus agréable pour sûr. De plus, je ne savais pas que vous pouviez simplement obtenir les éléments enums en faisant an_enum (x)
. Donc merci!
Python vous permet d'utiliser enumerable.name
et enumerable.value
. Afin de convertir un type enum en liste, essayez d'utiliser une compréhension de liste.
if 1 in [el.value for el in an_enum]: pass
Sidenode: Soyez prudent avec les assertions. Ils peuvent être ignorés si votre environnement de production est optimisé pour cela. Pour les vérifications importantes, vous devez utiliser
[el.value for el in an_enum] # returns: [1, 2] # Alternatively, look for the names [el.name for el in an_enum] # returns: ['first', 'second']
docs.python.org/3/library/enum.html#iteration
@meowgoesthedog J'y ai déjà pensé. Je pense que vous ne pouvez utiliser cela que si vous travaillez avec la classe de l'énumération. Puisque je ne définis pas de classe, cela ne semble pas possible
Essayez
type (an_enum)
pour obtenir la classe?À partir de Python 3.4, il existe un type
Enum
réel qui prend en chargelist (an_enum)
et bien plus encore.