enum - получение значения enum при преобразовании строки

113

Я определил следующее перечисление

from enum import Enum


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


print(D.x)

теперь напечатанное значение

D.x

вместо этого я хотел, чтобы значение перечисления было напечатано

1

Что можно сделать для достижения этой функциональности?

Вайбхав Мишра
источник
1
Я должен уточнить параметры доступа, я знаю, что такое Dxvalue, мне нужно преобразование строки Dx, чтобы вернуть значение, извините, если вопрос не проясняет условие.
Вайбхав Мишра

Ответы:

193

Вы печатаете объект перечисления . Используйте .valueатрибут, если хотите просто напечатать это:

print(D.x.value)

См Программный доступ к членам перечисления и их атрибуты раздела :

Если у вас есть член перечисления и вам нужно его имя или значение:

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

Вы можете добавить __str__метод в свое перечисление, если все, что вам нужно, - это предоставить настраиваемое строковое представление:

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

    x = 1
    y = 2

Демо:

>>> 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
Мартейн Питерс
источник
Когда я сравниваю его с целочисленным значением, он возвращается как объект. Пример: if D.x == 10: .... Какой подход я должен использовать для целых чисел?
alper 24
@alper: точно так же; D.x- объект перечисления, D.x.value- целочисленное значение. Если вам необходимо, чтобы значения перечисления действовали как целые числа, используйте IntEnumтип , где каждый элемент является подклассом intи поэтому IntEnumD.x == 10будет работать.
Мартейн Питерс
Я добавил def __eq__(self, other): return int(self.value) == otherи , def __int__(self): return int(self.value)но все - таки я думаю , что я должен использовать .valueв тех случаях , когда я не использую сравнение
Alper
@alper: эта __eq__реализация не работает, когда указано otherдругое значение перечисления; D.x == D.y, где D.x.value == D.y.valueбы правда, не получилось бы например. Похоже, вы хотите использовать IntEnumвместо Enumнего.
Мартин Питерс
8

Я реализовал доступ, используя следующие

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

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

теперь я могу просто сделать

print(D.x)получить 1как результат.

Вы также можете использовать, self.nameесли хотите распечатать xвместо 1.

Вайбхав Мишра
источник
2
Зачем форматирование строк и self._value_? return str(self.value)проще.
Martijn Pieters
1
Я просто посмотрел на исходный код, и вот как это реализовано, однако вы правы и self.valueчище.
Вайбхав Мишра
3
Атрибуты с одним подчеркиванием являются внутренними по отношению к сгенерированному классу перечисления; лучше придерживаться задокументированного атрибута (который является специальным дескриптором, чтобы вы все еще могли использовать его valueв качестве имени для своего типа перечисления).
Martijn Pieters
@MartijnPieters согласился
Vaibhav Mishra
0

Я нашел эту страницу при поиске доступа к объекту с Enumиспользованием строки. Я знаю, что в этом конкретном вопросе задают не об этом, но название «предполагает» это.

Чтобы получить Enum с использованием String, вы можете сделать следующее:

from enum import Enum


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


print(D["x"])  # <D.x: 1>
Кервин Снейдерс
источник