如何迭代枚举标志别名?

tel*_*ios 5 python python-3.11

问题

如何迭代枚举标志别名?

from enum import Flag

class Color(Flag):
    RED = 1
    BLUE = 2
    GREEN = 4
    WHITE = RED | BLUE | GREEN # <- How do I retrieve this alias?

list(Color) 
# [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 4>]
# How do I include Color.White and other aliases in this list?
Run Code Online (Sandbox Code Playgroud)

根据文档,__iter__仅返回非别名成员。

__iter__(self)
返回所有包含的非别名成员
版本 3.11 中的更改:迭代期间不再返回别名。

Ch3*_*teR 3

您可以使用__members__来获取枚举名称到值的映射。

来自 python文档

__members__是 member_name:member 项的只读有序映射。它仅在课堂上可用。

mapping = Color.__members__
# mappingproxy({'RED': <Color.RED: 1>,
#              'BLUE': <Color.BLUE: 2>,
#              'GREEN': <Color.GREEN: 4>,
#              'WHITE': <Color.WHITE: 7>})

colors_list = list(mapping.values())
# [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 4>, <Color.WHITE: 7>]
Run Code Online (Sandbox Code Playgroud)

不过,对此有一个警告。如果您有相似的枚举值,那么您将获得为它们返回的相同值。

class Color(Flag):
    RED = 1
    BLUE = 1
print(Color.__members__)
# mappingproxy({'RED': <Color.RED: 1>, 'BLUE': <Color.RED: 1>})
Run Code Online (Sandbox Code Playgroud)

有用的链接:Enum HOWTO:迭代Enum HOWTO:复制枚举成员和值

  • 列表理解可以进一步简化为“list(mapping.values)” (2认同)