检查枚举值是否在枚举类型中的惯用方式。

3

我想要检查某个枚举类型的值集合中是否存在某个字符串值。这里是我的代码:

from enum import Enum

class Color(str, Enum):

    RED = "red"
    GREEN = "green"
    YELLOW = "yellow"

s = "red"
# s = "blue"

if any(s == c.value for c in Color):
    print(Color(s))

当我查看文档时,我发现:

EnumMeta元类负责提供contains()dir()iter()和其他方法,使得我们可以在枚举类中执行一些通常在普通类上失败的操作,例如list(Color)或some_enum_var in Color

但我想要不同的东西(检查值的存在性)。是否有更符合Python风格的解决方案?

3个回答

4
在Python 3.12中,您可以直接使用in来执行此操作。
>>> "red" in Color
<stdin>:1: DeprecationWarning: in 3.12 __contains__ will no longer raise TypeError, but will return True if
obj is a member or a member's value
...
TypeError: unsupported operand type(s) for 'in': 'str' and 'EnumMeta'

在等待那个解决方案的同时,除了您已经找到的选项之外,另一个选择是将您的值传递给构造函数,如果有匹配的值,它将返回相应的枚举实例,否则会引发 ValueError

>>> Color("red")
<Color.RED: 'red'>
>>> Color("asdf")
Traceback (most recent call last):
...
ValueError: 'asdf' is not a valid Color

2
您可以通过访问Enum子类的字典属性_value2member_map_来测试值,该属性将值映射到成员类。如果您不想在代码中添加try-except块,这是一个好选择。请注意保留HTML标签。
if s in Color._value2member_map_:
    print(Color(s))

1

这是一个基于blhsing的答案稍微更美观一些的实现:

from enum import Enum

class Color(str, Enum):

    RED = "red"
    GREEN = "green"
    YELLOW = "yellow"

    @staticmethod
    def values():
        # provide a meaningful named getter
        return Color._value2member_map_

s = "green"
# s = "blue"

# actual use becomes more clear
if s in Color.values():
    print(Color(s))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接