测试值
变体1
请注意,一个Enum
有一个成员叫_value2member_map_
(未记录,可能会在未来的 python 版本中更改/删除):
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
你可以测试一个值是否在你的Enum
对照这张地图:
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
变体2
如果您不想依赖此功能,这是一个替代方案:
values = [item.value for item in Fruit] # [4, 5, 6]
或者(可能更好):使用set
; the in
操作员将更加高效:
values = set(item.value for item in Fruit) # {4, 5, 6}
然后测试
5 in values # True
7 in values # False
add has_value
到你的班级
然后您可以将其作为方法添加到您的类中:
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
@classmethod
def has_value(cls, value):
return value in cls._value2member_map_
print(Fruit.has_value(5)) # True
print(Fruit.has_value(7)) # False
从 python 3.9 (?) 开始 python 提供IntEnum https://docs.python.org/3/library/enum.html#enum.IntEnum。有了这些你可以这样做:
from enum import IntEnum
class Fruit(IntEnum):
Apple = 4
Orange = 5
Pear = 6
print(6 in iter(Fruit)) # True
请注意,无需创建list
;只是迭代iter(Fruit)
会做。再次强调,如果重复需要,可能值得像上面那样创建一个集合:
values = set(Fruit)
print(5 in values) # True
测试按键
如果你想测试名称(而不是值),我会使用_member_names_
:
'Apple' in Fruit._member_names_ # True
'Mango' in Fruit._member_names_ # False