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

时间:2015-04-07 23:41:10

标签: python enums

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

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

我想在某处打印[1, 2]作为列表。我怎样才能做到这一点?

10 个答案:

答案 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.Enumname

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)