Я використовую бібліотеку Enum4 для створення enum класу наступним чином:
class Color(Enum):
RED = 1
BLUE = 2
Я хочу [1, 2]
десь надрукувати як список. Як я можу цього досягти?
Я використовую бібліотеку Enum4 для створення enum класу наступним чином:
class Color(Enum):
RED = 1
BLUE = 2
Я хочу [1, 2]
десь надрукувати як список. Як я можу цього досягти?
Відповіді:
Ви можете використовувати 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]
a = [(int(v), str(v)) for v in Color]
і далі print(a)
.
[(color.value, color.name) for color in Color]
Щоб використовувати 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')]
@classmethod
, знадобиться створити екземпляр Color
класу. Ось чому, staticmethod
здається, тут правильний вибір.
@classmethod
та використовувати return list(map(lambda c: c.value, cls))
замість цього.
Виходячи з відповіді @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']
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}
Таким чином, 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, затребуваний за те, щоб внести до таблиці новий ( для мене ) атрибут.
Використовуйте _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()))
поверне всі дійсні значення кольору
ви можете використовувати функцію iter ():
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)