enum - отримання значення enum при перетворенні рядків


108

У мене визначено наступні перерахунки

from enum import Enum


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


print(D.x)

тепер друковане значення -

D.x

натомість я хотів, щоб значення перерахунку було друком

1

Що можна зробити для досягнення цієї функціональності?


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

Відповіді:


188

Ви друкуєте об’єкт enum . Використовуйте .valueатрибут, якщо ви хотіли просто надрукувати це:

print(D.x.value)

Див Програмний доступ до членів перерахування і їх атрибути розділу :

Якщо у вас є член enum і вам потрібно його ім'я або значення:

>>>
>>> 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: точно так само; D.xє об'єктом enum, D.x.valueце ціле значення. Якщо у вас повинні бути значення enum, як цілі числа, використовуйте IntEnumтип , де кожен елемент є підкласом intі так IntEnumD.x == 10буде працювати.
Martijn Pieters

Я додав 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цього.
Martijn Pieters

7

Я реалізував доступ, використовуючи наступне

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
Атрибути одного підкреслення є внутрішніми для створеного класу enum; краще дотримуйтесь задокументованого атрибуту (який, як правило, є спеціальним дескриптором, щоб ви все ще могли використовувати valueяк ім'я для вашого типу enum).
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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.