enum - obtenir la valeur de enum lors de la conversion de chaîne

110

J'ai défini l'énumération suivante

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

maintenant la valeur imprimée est

D.x

à la place, je voulais que la valeur de l'énumération soit imprimée

1

Que peut-on faire pour obtenir cette fonctionnalité?

Vaibhav Mishra
la source
1
Je devrais clarifier les paramètres d'accès, je connais la chose Dxvalue, ce que je veux, c'est la conversion de chaîne Dx pour renvoyer la valeur, désolé si la question ne clarifie pas la condition.
Vaibhav Mishra

Réponses:

189

Vous imprimez l' objet enum . Utilisez l' .valueattribut si vous vouliez simplement imprimer cela:

print(D.x.value)

Voir l' accès aux membres de la Programmatic énumération et leurs attributs section :

Si vous avez un membre enum et avez besoin de son nom ou de sa valeur:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

Vous pouvez ajouter une __str__méthode à votre énumération, si tout ce que vous vouliez était de fournir une représentation sous forme de chaîne personnalisée:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

Démo:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1
Martijn Pieters
la source
Quand je le compare avec une valeur entière, il retourne comme objet. Ex: if D.x == 10: .... Quelle approche dois-je adopter pour les nombres entiers?
alper le
@alper: exactement de la même manière; D.xest l'objet enum, D.x.valueest une valeur entière. Si les valeurs d'énumération doivent agir comme des entiers, utilisez le IntEnumtype , où chaque élément est une sous-classe deint et donc IntEnumD.x == 10fonctionnerait.
Martijn Pieters
J'ai ajouté def __eq__(self, other): return int(self.value) == otheret def __int__(self): return int(self.value)mais je pense toujours que je dois utiliser.value sur des cas où je n'utilise pas de comparaison
alper le
@alper: cette __eq__implémentation ne fonctionne pas quand otherest une autre valeur enum; D.x == D.y, oùD.x.value == D.y.value serait vrai, échouerait par exemple. Il semble que vous souhaitiez utiliser à la IntEnumplace de Enumlà.
Martijn Pieters
8

J'ai implémenté l'accès en utilisant ce qui suit

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

maintenant je peux juste faire

print(D.x) obtenir 1 comme résultat.

Vous pouvez également utiliser self.namesi vous souhaitez imprimer à la xplace de 1.

Vaibhav Mishra
la source
2
Pourquoi le formatage de la chaîne et self._value_? return str(self.value)est plus simple.
Martijn Pieters
1
Je viens de regarder la source et c'est ainsi qu'elle est mise en œuvre, mais vous avez raison et elle self.valueest plus propre.
Vaibhav Mishra
3
Les attributs de soulignement unique sont internes à la classe enum générée; mieux vaut s'en tenir à l'attribut documenté (qui se trouve être un descripteur spécial afin que vous puissiez toujours l'utiliser valuecomme nom sur votre type enum).
Martijn Pieters
@MartijnPieters d'accord
Vaibhav Mishra
0

J'ai trouvé cette page lors de la recherche pour accéder à un en Enumutilisant une chaîne. Je sais que ce n'est pas ce qui est demandé dans cette question particulière, mais le titre le «suggère».

Pour obtenir une énumération à l'aide d'une chaîne, vous pouvez effectuer les opérations suivantes:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
Kerwin Sneijders
la source