@ user2340939 Возвращает список перечислений, а не список значений. Если вас это устраивает, можете использоватьlist(Color)
endolith
1
Это должно быть помечено как правильный ответ.
SKYFALL26,
22
Чтобы использовать Enum с любым типом значения, попробуйте следующее:
Обновлено с некоторыми улучшениями ... Спасибо, @Jeff, за ваш совет!
from enum importEnumclassColor(Enum):
RED =1
GREEN ='GREEN'
BLUE =('blue','#0000ff')@staticmethoddef list():return list(map(lambda c: c.value,Color))print(Color.list())
Я бы использовал @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 importEnumclassExtendedEnum(Enum):@classmethoddef list(cls):return list(map(lambda c: c.value, cls))classOperationType(ExtendedEnum):
CREATE ='CREATE'
STATUS ='STATUS'
EXPAND ='EXPAND'
DELETE ='DELETE'print(OperationType.list())
class enum.Enum- это класс, который решает все ваши потребности в перечислении, поэтому вам просто нужно наследовать от него и добавить свои собственные поля. С этого момента все, что вам нужно сделать, это просто называть его атрибутами: name& value:
from enum importEnumclassLetter(Enum):
A =1
B =2
C =3print({i.name: i.value for i inLetter})# 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участников. ... кстати, проголосовали за добавление нового ( для меня ) атрибута в таблицу.
IAbstract
@IAbstract: Нет, это запрещено. Если кто-то найдет способ добавления / вычитания членов после создания Enum, он, вероятно, сломает это Enum.
Итан Фурман,
@IAbstract: добавлять новых участников постфактум - не самая лучшая идея. Если вы действительно хотите, ознакомьтесь с этим ответом .
Итан Фурман,
1
Используйте _member_names_для быстрого и легкого результата, если это только имена, т.е.
Color._member_names_
Кроме того, у вас есть _member_map_который возвращает упорядоченный словарь элементов. Эта функция возвращает a collections.OrderedDict, так что у вас есть Color._member_names_.items()и Color._member_names_.values()с чем можно поиграть. Например
a = [(int(v), str(v)) for v in Color]
а потомprint(a)
.[(color.value, color.name) for color in Color]
Вы можете сделать следующее:
источник
list(Color)
Чтобы использовать Enum с любым типом значения, попробуйте следующее:
Обновлено с некоторыми улучшениями ... Спасибо, @Jeff, за ваш совет!
В результате:
источник
@classmethod
, потребуется создать экземплярColor
класса. Поэтомуstaticmethod
выбор здесь кажется правильным.@classmethod
и использоватьreturn list(map(lambda c: c.value, cls))
вместо этого.Основываясь на ответе @Jeff, проведен рефакторинг для использования,
classmethod
чтобы вы могли повторно использовать тот же код для любого из ваших перечислений:Производит:
источник
class
enum.Enum
- это класс, который решает все ваши потребности в перечислении, поэтому вам просто нужно наследовать от него и добавить свои собственные поля. С этого момента все, что вам нужно сделать, это просто называть его атрибутами:name
&value
:источник
Так что
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_
для быстрого и легкого результата, если это только имена, т.е.Кроме того, у вас есть
_member_map_
который возвращает упорядоченный словарь элементов. Эта функция возвращает acollections.OrderedDict
, так что у вас естьColor._member_names_.items()
иColor._member_names_.values()
с чем можно поиграть. Напримервернет все допустимые значения Color
источник
вы можете использовать функцию iter ():
источник