我想检查某些枚举的值集中是否存在某些字符串值。这就是我所做的:
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 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
如果您不想用
_value2member_map_
块弄乱您的代码,您可以针对 Enum
测试值,try-except
子类的 dict 属性,将值映射到成员类:
if s in Color._value2member_map_:
print(Color(s))
这是一个基于 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))
只需将其转换为值列表并检查即可
"red" in [item.value for item in Color]