Я использую библиотеку Enum4 для создания класса перечисления следующим образом:
class Color(Enum):
RED = 1
BLUE = 2
Я хочу [1, 2]
где-нибудь распечатать список. Как мне этого добиться?
Я использую библиотеку Enum4 для создания класса перечисления следующим образом:
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]
Вы можете сделать следующее:
[e.value for e in Color]
list(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__
диктат. Решение, предложенное @ozgur, действительно лучшее, но вы можете сделать то же самое, но с большей работой.
[color.value for color_name, color in Color.__members__.items()]
__members__
Словарь может пригодиться , если вы хотите , чтобы вставить материал динамически в нем ... в какой - то сумасшедшей ситуации.
[РЕДАКТИРОВАТЬ]
Видимо __members__
это не словарь, а прокси карты. Это означает, что вы не можете легко добавлять в него элементы.
Однако вы можете делать такие странные вещи, как MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, а затем вы можете использовать новый ключ, например MyEnum.new_key
.... но это всего лишь деталь реализации, и с ней не следует играть. Черная магия оплачивается огромными затратами на обслуживание.
__members__
? Это был бы интересный способ разрешить расширения, тем самым создавая новых Enum
участников. ... кстати, проголосовали за добавление нового ( для меня ) атрибута в таблицу.
Используйте _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()))
вернет все допустимые значения Color
вы можете использовать функцию iter ():
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)