如何从python枚举类获取所有值?


140

我正在使用Enum4库来创建枚举类,如下所示:

class Color(Enum):
    RED = 1
    BLUE = 2

我想以[1, 2]列表形式打印在某处。我该如何实现?

Answers:


48

您可以使用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]

您使用第三方之一。但它也说它有内在的一面
Marcin

我如何打印像[(1,'RED'),(2,'BLUE')]
user1159517

那呢:a = [(int(v), str(v)) for v in Color]然后print(a)
Marcin 2015年

34
怎么样:[(color.value, color.name) for color in Color]
vlad-ardelean

2
@ vlad-ardelean的评论是最好也是最Python的。这就是枚举类型的习惯用法,优雅,有突出的可读性
dusktreader

431

您可以执行以下操作:

[e.value for e in Color]

1
@ user2340939这将返回枚举列表,而不是值列表。如果您对此表示满意,则不妨使用list(Color)
Endolith

1
这应该标记为正确答案。
SKYFALL26

22

要将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')]

6
我会使用@classmethod而不是@ staticmethod
ISONecroMAn

1
我猜@ISONecroMAn @classmethod需要创建Color类的实例。这就是为什么staticmethod这里似乎是正确的选择。
Leonid Dashko '18

@LeonidDashko一点也不。看我的答案。
blueFast

@LeonidDashko @dangoonfast是正确的。您可以使用@classmethodreturn list(map(lambda c: c.value, cls))代替。
Riptyde4

18

根据@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']

7

class enum.Enum是解决所有枚举需求的类,因此您只需要继承它,并添加自己的字段即可。然后,您只需要调用其属性即可:namevalue

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}

6

所以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:不,那是不允许的。如果在创建枚举后确实找到了添加/减去成员的方法,他们可能会破坏该枚举。
伊桑·弗曼

@IAbstract:在事实之后添加新成员通常不是一个好主意。如果您确实想要,请查看此答案
伊森·弗曼

1

使用_member_names_一种快速简单的结果,如果它仅仅是个名字,即

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的所有有效值


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.