根据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 上的相关问题。此外,我自己也尝试过一些例子,这似乎符合预期。尽管如此,我并没有成功找到我的确切问题的答案。
任何有关是否可以的见解,以及较低级别的实际差异可能是什么,我们都非常感激。
一般来说,如果
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