检查值是否在枚举内的惯用方法

问题描述 投票:0回答:4

我想检查某些枚举的值集中是否存在某些字符串值。这就是我所做的:

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() 和其他方法,允许使用 Enum 类执行在典型类上失败的操作,例如 list( Color) 或 Color 中的 some_enum_var

但我想要一些不同的东西(检查是否存在)。有没有更Pythonic的方法来解决这个问题?

python string enums
4个回答
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
投票

如果您不想用

_value2member_map_
块弄乱您的代码,您可以针对
Enum
测试值,
try-except
子类的 dict 属性,将值映射到成员类:

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))

0
投票

只需将其转换为值列表并检查即可

"red" in [item.value for item in Color]
© www.soinside.com 2019 - 2024. All rights reserved.