Як отримати всі значення з класу python enum?


140

Я використовую бібліотеку Enum4 для створення enum класу наступним чином:

class Color(Enum):
    RED = 1
    BLUE = 2

Я хочу [1, 2]десь надрукувати як список. Як я можу цього досягти?

Відповіді:


48

Ви можете використовувати IntEnum :

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

Щоб отримати список вкладених даних:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]

Ви використовуєте сторонню сторону. Але він також говорить, що має інтуум
Марцін

Як я друкую, як [(1, "ЧЕРВЕНО"), (2, "
СВІТИЙ

Що з цього приводу: a = [(int(v), str(v)) for v in Color]і далі print(a).
Марцін

34
Як щодо цього:[(color.value, color.name) for color in Color]
влада-арделея

2
Коментар @ vlad-ardelean - найкращий і найпітонічніший. Ось ідіоматичне використання типу Enum, елегантне і добре читабельне
dusktreader

431

Ви можете зробити наступне:

[e.value for e in Color]

1
@ user2340939 Це повертає список перерахунків, а не список значень. Якщо ви з цим все гаразд, можете також скористатисяlist(Color)
endolith

1
Це слід позначити як правильну відповідь.
SKYFALL26

22

Щоб використовувати Enum з будь-яким типом значень, спробуйте це:
Оновлено з деякими вдосконаленнями ... Спасибі @Jeff, за наказом!

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 'GREEN'
    BLUE = ('blue', '#0000ff')

    @staticmethod
    def list():
        return list(map(lambda c: c.value, Color))

print(Color.list())

Як результат:

[1, 'GREEN', ('blue', '#0000ff')]

6
Я б використав @classmethod замість @ staticmethod
ISONecroMAn

1
@ISONecroMAn Я думаю @classmethod, знадобиться створити екземпляр Colorкласу. Ось чому, staticmethodздається, тут правильний вибір.
Леонід Дашко

@LeonidDashko зовсім не є. Дивіться мою відповідь.
blueFast

@LeonidDashko @dangoonfast є правильним. Ви можете використовувати @classmethodта використовувати return list(map(lambda c: c.value, cls))замість цього.
Riptyde4

18

Виходячи з відповіді @Jeff, відремонтували на використання classmethodтак, щоб ви могли повторно використовувати той самий код для будь-якого зі своїх переліків:

from enum import Enum

class ExtendedEnum(Enum):

    @classmethod
    def list(cls):
        return list(map(lambda c: c.value, cls))

class OperationType(ExtendedEnum):
    CREATE = 'CREATE'
    STATUS = 'STATUS'
    EXPAND = 'EXPAND'
    DELETE = 'DELETE'

print(OperationType.list())

Виробляє:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']

7

class enum.Enum- це клас, який вирішує всі ваші потреби в перерахуванні, тому вам просто потрібно успадкувати його і додати свої власні поля. Тоді відтепер все, що вам потрібно зробити, - це просто зателефонувати за його атрибутами: name& value:

from enum import Enum

class Letter(Enum):
   A = 1
   B = 2
   C = 3

print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}

6

Таким чином, Enumмає __members__Dict. Рішення, яке запропонував @ozgur, дійсно найкраще, але ви можете зробити це, зробивши те саме, зробивши більше роботи

[color.value for color_name, color in Color.__members__.items()]

The __members__Словник може стати в нагоді , якщо ви хочете , щоб вставити матеріал динамічно в ньому ... в якій - то божевільною ситуації.

[EDIT] Мабуть__members__ це не словник, а проксі-карта. Це означає, що ви не можете легко додати елементи до нього.

Однак ви можете робити такі дивні речі, як MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'потім, і ви можете використовувати новий ключ, як MyEnum.new_key.... але це лише детальна інформація про реалізацію, і з нею не слід грати. Чорна магія оплачується величезними витратами на обслуговування.


Лише бічна панель: чи можна додавати елементи __members__? Це був би цікавий спосіб дозволити розширення, тим самим створивши нових Enumчленів. ... btw, затребуваний за те, щоб внести до таблиці новий ( для мене ) атрибут.
IАнотація

@IAbrief: Ні, це заборонено. Якщо хтось знайде спосіб додавання / віднімання членів після створення Enum, він, ймовірно, зламає цей Enum.
Етан Фурман

@IAbrief: Додавання нових членів після факту зазвичай не є гарною ідеєю. Якщо ви дійсно хочете, ознайомтеся з цією відповіддю .
Етан Фурман

1

Використовуйте _member_names_для швидкого простого результату, якщо це лише назви, тобто

Color._member_names_

Також у вас є _member_map_який повертає впорядкований словник елементів. Ця функція повертає a collections.OrderedDict, тому вам доведеться Color._member_names_.items()і Color._member_names_.values()з нею грати. Напр

return list(map(lambda x: x.value, Color._member_map_.values()))

поверне всі дійсні значення кольору


-1

ви можете використовувати функцію iter ():

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.