enum - ottenere il valore di enum sulla conversione di stringhe


108

Ho definito l'enum seguente

from enum import Enum


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


print(D.x)

ora il valore stampato è

D.x

invece volevo che il valore dell'enumerazione fosse print

1

Cosa si può fare per ottenere questa funzionalità?


1
Dovrei chiarire i parametri di accesso, conosco la cosa Dxvalue, quello che voglio è la conversione della stringa Dx per restituire il valore, scusa se la domanda non chiarisce la condizione.
Vaibhav Mishra

Risposte:


188

Stai stampando l' oggetto enum . Usa l' .valueattributo se vuoi solo stamparlo:

print(D.x.value)

Vedere l' accesso programmatico ai membri di enumerazione e la loro attributi sezione :

Se hai un membro enum e hai bisogno del suo nome o valore:

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

Potresti aggiungere un __str__metodo alla tua enumerazione, se tutto ciò che desideri fosse fornire una rappresentazione di stringa personalizzata:

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

Quando lo confronto con un valore intero, ritorna come oggetto. Es: if D.x == 10: .... Quale approccio devo adottare per i numeri interi?
alper

@alper: esattamente allo stesso modo; D.xè l'oggetto enum, D.x.valueè un valore intero. Se devi fare in modo che i valori enum agiscano come interi, usa il IntEnumtipo , dove ogni elemento è una sottoclasse di inte così IntEnumD.x == 10funzionerebbe.
Martijn Pieters

Ho aggiunto def __eq__(self, other): return int(self.value) == othere def __int__(self): return int(self.value)ma penso ancora di doverlo usare .valuenei casi in cui non uso il confronto
alper

@alper: quell'implementazione __eq__non funziona quando otherè un altro valore enum; D.x == D.y, dove D.x.value == D.y.valuesarebbe vero, fallirebbe per esempio. Sembra che tu voglia usare IntEnuminvece di Enumlì.
Martijn Pieters

7

Ho implementato l'accesso utilizzando quanto segue

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

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

ora posso solo fare

print(D.x)per ottenere 1come risultato.

Puoi anche usare self.namenel caso in cui volessi stampare xinvece di 1.


2
Perché la formattazione della stringa e self._value_? return str(self.value)è più semplice.
Martijn Pieters

1
Ho appena guardato la fonte ed è stato così implementato, comunque hai ragione ed self.valueè più pulito.
Vaibhav Mishra

3
Gli attributi del carattere di sottolineatura singolo sono interni alla classe enum generata; meglio attenersi all'attributo documentato (che sembra essere un descrittore speciale in modo che tu possa ancora usare valuecome nome sul tuo tipo di enumerazione).
Martijn Pieters

@MartijnPieters concordato
Vaibhav Mishra

0

Ho trovato questa pagina durante la ricerca di accesso a Enumutilizzando una stringa. So che questo non è ciò che viene chiesto in questa particolare domanda, ma il titolo lo "suggerisce".

Per ottenere un Enum usando una stringa puoi fare quanto segue:

from enum import Enum


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


print(D["x"])  # <D.x: 1>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.