enum - pobieranie wartości wyliczenia przy konwersji ciągu

108

Mam zdefiniowane następujące wyliczenie

from enum import Enum


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


print(D.x)

teraz drukowana wartość to

D.x

zamiast tego chciałem wydrukować wartość wyliczenia

1

Co można zrobić, aby osiągnąć taką funkcjonalność?

Vaibhav Mishra
źródło
1
Powinienem wyjaśnić parametry dostępu, znam rzecz Dxvalue, chcę, aby konwersja ciągu Dx zwróciła wartość, przepraszam, jeśli pytanie nie wyjaśnia warunku.
Vaibhav Mishra

Odpowiedzi:

188

Drukujesz obiekt wyliczenia . Użyj .valueatrybutu, jeśli chcesz po prostu wydrukować to:

print(D.x.value)

Zobacz sekcję Programowy dostęp do elementów członkowskich wyliczenia i ich atrybutów :

Jeśli masz element członkowski wyliczenia i potrzebujesz jego nazwy lub wartości:

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

Możesz dodać __str__metodę do swojego wyliczenia, jeśli wszystko, co chcesz, to zapewnić niestandardową reprezentację ciągu:

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

    x = 1
    y = 2

Próbny:

>>> 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
źródło
Kiedy porównuję to z wartością całkowitą, zwraca ona jako obiekt. Np if D.x == 10: .... : . Jakie podejście należy przyjąć w przypadku liczb całkowitych?
alper
@alper: dokładnie w ten sam sposób; D.xjest obiektem wyliczenia, D.x.valuejest wartością całkowitą. Jeśli wartości wyliczenia muszą zachowywać się jak liczby całkowite, użyj IntEnumtypu , w którym każdy element jest podklasą inti tak IntEnumD.x == 10będzie działać.
Martijn Pieters
Dodałem def __eq__(self, other): return int(self.value) == otheri def __int__(self): return int(self.value)ale nadal myślę, że muszę używać .valuew przypadkach, gdy nie używam porównywania
alper
@alper: ta __eq__implementacja nie działa, gdy otherjest inną wartością wyliczenia; D.x == D.y, gdzie D.x.value == D.y.valuebyłoby prawdą, nie powiedzie się na przykład. Wygląda na to, że chcesz użyć IntEnumzamiast tego Enum.
Martijn Pieters
7

Zaimplementowałem dostęp za pomocą następującego

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

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

teraz mogę po prostu zrobić

print(D.x)uzyskać 1jako wynik.

Możesz również użyć, self.namejeśli chcesz drukować xzamiast 1.

Vaibhav Mishra
źródło
2
Dlaczego formatowanie ciągów i self._value_? return str(self.value)jest prostsze.
Martijn Pieters
1
Właśnie spojrzałem na źródło i tak jest zaimplementowane, jednak masz rację i self.valuejest czystsze.
Vaibhav Mishra
3
Atrybuty z pojedynczym podkreśleniem są wewnętrzne dla wygenerowanej klasy wyliczeniowej; lepiej trzymaj się udokumentowanego atrybutu (który jest specjalnym deskryptorem, aby nadal można było używać go valuejako nazwy w typie wyliczenia).
Martijn Pieters
@MartijnPieters zgodził się
Vaibhav Mishra
0

Znalazłem tę stronę podczas wyszukiwania dostępu do Enumciągu znaków. Wiem, że nie o to zadaje się w tym konkretnym pytaniu, ale tytuł „sugeruje” to.

Aby uzyskać wyliczenie za pomocą ciągu, możesz wykonać następujące czynności:

from enum import Enum


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


print(D["x"])  # <D.x: 1>
Kerwin Sneijders
źródło