我使用Enum4库创建一个枚举类如下:

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

我想把[1,2]作为一个列表打印出来。我怎样才能做到这一点呢?


当前回答

Enum有一个__members__字典。 @ozgur提出的解决方案确实是最好的,但你可以这样做,它做的是同样的事情,但需要更多的工作

(颜色。color . __member__ .items()中color_name的值

__members__字典可以派上用场,如果你想在其中动态地插入东西…在一些疯狂的情况下。

(编辑) 显然__members__不是一个字典,而是一个映射代理。这意味着你不能轻易地向它添加项目。

你也可以做一些奇怪的事情,比如MyEnum。__dict__['_member_map_']['new_key'] = 'new_value',然后你可以使用像myenumer .new_key....这样的新键但这只是一个实现细节,不应该玩弄。黑魔法需要大量的维护费用。

其他回答

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}

只使用:

[e.value for e in Color]

生产:

[1, 2]

要获得名称,请使用:

[e.name for e in Color]

生产:

(“红”、“蓝”)

Enum有一个__members__字典。 @ozgur提出的解决方案确实是最好的,但你可以这样做,它做的是同样的事情,但需要更多的工作

(颜色。color . __member__ .items()中color_name的值

__members__字典可以派上用场,如果你想在其中动态地插入东西…在一些疯狂的情况下。

(编辑) 显然__members__不是一个字典,而是一个映射代理。这意味着你不能轻易地向它添加项目。

你也可以做一些奇怪的事情,比如MyEnum。__dict__['_member_map_']['new_key'] = 'new_value',然后你可以使用像myenumer .new_key....这样的新键但这只是一个实现细节,不应该玩弄。黑魔法需要大量的维护费用。

一种方法是获取_value2member_map_属性的键值:

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

list(Color._value2member_map_.keys())
# [1, 2]

使用__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类并且想要抽象类方法:

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"