4
votes

Convertir une énumération en liste en Python

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"?


4 commentaires

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 charge list (an_enum) et bien plus encore.


3 Réponses :


3
votes

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']

2 commentaires

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]



4
votes

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


1 commentaires

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!



2
votes

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']


0 commentaires