enum - Ermittelt den Wert von enum bei der Zeichenfolgenkonvertierung


108

Ich habe folgende Aufzählung definiert

from enum import Enum


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


print(D.x)

jetzt ist der gedruckte Wert

D.x

Stattdessen wollte ich, dass der Wert der Aufzählung gedruckt wird

1

Was kann getan werden, um diese Funktionalität zu erreichen?


1
Ich sollte die Zugriffsparameter klären, ich kenne die Dxvalue-Sache. Ich möchte, dass die Dx-String-Konvertierung den Wert zurückgibt. Tut mir leid, wenn die Frage die Bedingung nicht klar macht.
Vaibhav Mishra

Antworten:


188

Sie drucken das Enum- Objekt . Verwenden Sie das .valueAttribut, wenn Sie nur das drucken möchten:

print(D.x.value)

Siehe den Abschnitt Programmatischer Zugriff auf Aufzählungselemente und ihre Attribute :

Wenn Sie ein Enum-Mitglied haben und dessen Namen oder Wert benötigen:

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

Sie können __str__Ihrer Aufzählung eine Methode hinzufügen , wenn Sie lediglich eine benutzerdefinierte Zeichenfolgendarstellung bereitstellen möchten:

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

    x = 1
    y = 2

Demo:

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

Wenn ich es mit einem ganzzahligen Wert vergleiche, wird es als Objekt zurückgegeben. Bsp. : if D.x == 10: .... Welchen Ansatz sollte ich für ganze Zahlen wählen?
Alper

@alper: genau so; D.xist das Enum-Objekt, D.x.valueist ein ganzzahliger Wert. Wenn sich die Aufzählungswerte wie Ganzzahlen verhalten müssen, verwenden Sie den IntEnumTyp , bei dem jedes Element eine Unterklasse von ist intund daher IntEnumD.x == 10funktionieren würde.
Martijn Pieters

Ich habe hinzugefügt def __eq__(self, other): return int(self.value) == otherund def __int__(self): return int(self.value)trotzdem denke ich, dass ich in .valueFällen verwenden muss, in denen ich keinen Vergleich verwende
am

@alper: Diese __eq__Implementierung funktioniert nicht, wenn otheres sich um einen anderen Enum-Wert handelt. D.x == D.y, wo D.x.value == D.y.valuewahr wäre, würde zum Beispiel scheitern. Es hört sich so an, als ob Sie es IntEnumanstelle von Enumdort verwenden möchten .
Martijn Pieters

7

Ich habe den Zugriff wie folgt implementiert

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

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

jetzt kann ich es einfach machen

print(D.x)1als Ergebnis zu bekommen .

Sie können auch verwenden, self.namewenn Sie xstatt drucken möchten 1.


2
Warum die String-Formatierung und self._value_? return str(self.value)ist einfacher.
Martijn Pieters

1
Ich habe mir nur die Quelle angesehen und so wurde sie implementiert, aber Sie haben Recht und self.valuesind sauberer.
Vaibhav Mishra

3
Die einzelnen Unterstrichattribute befinden sich innerhalb der generierten Enum-Klasse. Halten Sie sich besser an das dokumentierte Attribut (das zufällig ein spezieller Deskriptor ist, damit Sie es weiterhin valueals Namen für Ihren Aufzählungstyp verwenden können).
Martijn Pieters

@ MartinijnPieters vereinbart
Vaibhav Mishra

0

Ich habe diese Seite gefunden, als ich nach dem Zugriff Enumauf eine Zeichenfolge gesucht habe . Ich weiß, dass dies nicht das ist, was in dieser speziellen Frage gestellt wird, aber der Titel "schlägt" es vor.

Um eine Aufzählung mit einem String zu erhalten, haben Sie folgende Möglichkeiten:

from enum import Enum


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


print(D["x"])  # <D.x: 1>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.