Я використовую бібліотеку 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)