如何在不使用 try/catch 的情况下测试 Python 枚举中是否存在 int 值?

2024-01-17

使用Python Enum类,有没有一种方法可以在不使用try/catch的情况下测试Enum是否包含特定的int值?

具有以下课程:

from enum import Enum

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

如何测试值 6(返回 true)或值 7(返回 false)?


测试值

变体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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用 try/catch 的情况下测试 Python 枚举中是否存在 int 值? 的相关文章

随机推荐