检查 Enum 类型的变量是否在一组 Enum 中

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

根据Python中Enums的文档,由于Enums是单例,所以比较主要是指

is
运算符。但是,如果要检查一个枚举是否在一组枚举中,那么使用
in
运算符就完全可以了吗?它似乎按预期工作,但如果有任何必须注意的警告,我的知识就不够了。

以下代码足以作为说明性示例:

from enum import auto, StrEnum


class MyEnum(StrEnum):
    STR1 = auto()
    STR2 = auto()
    STRN = auto()


def main():

    foo = MyEnum.STR1

    if foo in {MyEnum.STR1, MyEnum.STR2}: # is this okay?
        print("foo")

    if foo is MyEnum.STR1 or foo is MyEnum.STR2: # the alternative following the documentation
        print("foo")

main()

我查阅了文档,发现

is
运算符是最佳实践,以及 StackOverflow 上的相关问题。此外,我自己也尝试过一些例子,这似乎符合预期。尽管如此,我并没有成功找到我的确切问题的答案。

任何有关是否可以的见解,以及较低级别的实际差异可能是什么,我们都非常感激。

python enums comparison membership
1个回答
0
投票

一般来说,如果

a is b
,则
a == b
。这是平等的自反属性:一个对象应该等于它自己。

通常,如果

b
是可迭代的并且
a in b
,则
any(value == A for value in b)
。如果
a
包含在
b
中,则
b
必须至少有一个元素等于
a

因此,你可以假设

foo is MyEnum.STR1 or foo is MyEnum.STR2

相当于

foo == MyEnum.STR1 or foo == MyEnum.STR2

相当于

foo in {MyEnum.STR1, MyEnum.STR2}

互换使用它们是安全的,因为集合和枚举都是内置类型,并且没有任何特殊的相等或成员资格逻辑。

当然,使用

is
检查是一种很好的做法,但代码的可读性是更好的做法。如果需要与五个枚举值进行比较,哪种代码更具可读性?

if foo in {MyEnum.STR1, MyEnum.STR2, MyEnum.STR3, MyEnum.STR4, MyEnum.STR5}:
    pass

if foo is MyEnum.STR1 or foo is MyEnum.STR2 or foo is MyEnum.STR3 or foo is MyEnum.STR4 or foo is MyEnum.STR5:
    pass 
© www.soinside.com 2019 - 2024. All rights reserved.