我正在使用Enum4库创建一个枚举类,如下所示:
class Color(Enum):
RED = 1
BLUE = 2
我想在某处打印[1, 2]
作为列表。我怎样才能做到这一点?
答案 0 :(得分:249)
您可以执行以下操作:
[e.value for e in Color]
答案 1 :(得分:24)
您可以使用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]
答案 2 :(得分:15)
要将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')]
答案 3 :(得分:4)
所以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
....但这只是一个实现细节,不应该使用。黑魔法需要付出巨大的维护费用。
答案 4 :(得分:3)
class i
是解决所有枚举需求的类,因此您只需要继承它,并添加自己的字段即可。然后,您只需要调用其属性即可:enum.Enum
和name
:
value
答案 5 :(得分:3)
使用_member_names_
只是名称,即{p>
Color._member_names_
此外,您还有_member_map_
,该元素返回元素的有序字典。此函数返回一个collections.OrderedDict
,因此您可以玩Color._member_names_.items()
和Color._member_names_.values()
。例如
return list(map(lambda x: x.value, Color._member_map_.values()))
将返回Color的所有有效值
答案 6 :(得分:2)
将classmethod
与__members__
一起使用:
class RoleNames(str, Enum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
>>> role_names = RoleNames.list_roles()
>>> print(role_names)
或者如果您有多个Enum
类并想抽象classmethod
:
class BaseEnum(Enum):
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
class RoleNames(str, BaseEnum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
class PermissionNames(str, BaseEnum):
READ = "updated_at"
WRITE = "sort_by"
READ_WRITE = "sort_order"
答案 7 :(得分:2)
给定一个基于标准 python3 Enum/IntEnum 类的枚举:
from enum import IntEnum
class LogLevel(IntEnum):
DEBUG = 0
INFO = 1
WARNING = 2
ERROR = 3
可以执行以下操作来获取枚举常量列表:
>>> print(list(LogLevel))
[<LogLevel.DEBUG: 0>, <LogLevel.INFO: 1>, <LogLevel.WARNING: 2>, <LogLevel.ERROR: 3>]
我发现使用枚举常量而不是整数更有表现力。如果枚举继承自 IntEnum,则所有枚举常量也是整数,并且可以在任何地方使用:
>>> level = LogLevel.DEBUG
>>> level == 0
True
>>> level == 1
False
>>> level == LogLevel.INFO
False
>>> level == LogLevel.DEBUG
True
>>> "%d" % level
'0'
>>> "%s" % level
'LogLevel.DEBUG'
答案 8 :(得分:0)
根据@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']
答案 9 :(得分:0)
您可以使用iter()函数:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)