使用in运算符判断Enum成员时出现意外结果的原因
问题:为何枚举成员引用其他枚举时,字符串"clip"不在枚举成员元组中?
你在Python 3.9/3.10中运行以下代码时,输出为False,但预期是True:
import enum class OtherTest(str, enum.Enum): CLIP = "clip" class Test(str, enum.Enum): PACK = "pack" CLIP = OtherTest.CLIP print("clip" in (Test.PACK, Test.CLIP))
而将Test.CLIP直接赋值为字符串"clip"时,输出则为True:
import enum class OtherTest(str, enum.Enum): CLIP = "clip" class Test(str, enum.Enum): PACK = "pack" CLIP = "clip" # 直接赋值为字符串 print("clip" in (Test.PACK, Test.CLIP))
核心原因
当你把Test.CLIP赋值为OtherTest.CLIP时,Test.CLIP的实际存储值(value属性)是OtherTest.CLIP这个枚举实例,而非字符串"clip"。
Python的in操作符判断元素是否存在时,会通过==逐个比较元组内元素和目标值:
Test.PACK的value是"pack",和"clip"不相等;Test.CLIP是Test类的枚举实例,而"clip"是字符串类型。枚举的__eq__比较规则是:只有当两个对象是同一枚举类的实例且值完全相等时,才返回True。这里类型不匹配,所以"clip" == Test.CLIP返回False,最终in操作符判定"clip"不在元组中。
而在第二段代码中,Test.CLIP的value直接是字符串"clip",此时继承自str的枚举实例会和字符串做值匹配,"clip" == Test.CLIP返回True,因此in操作符返回True。
验证与修正
验证差异
在第一段代码中添加以下打印语句,就能直观看到内部逻辑:
print(Test.CLIP.value) # 输出: OtherTest.CLIP print(type(Test.CLIP.value)) # 输出: <enum 'OtherTest'> print(Test.CLIP == "clip") # 输出: False print(str(Test.CLIP) == "clip") # 输出: True(转成字符串后才匹配)
修正代码
如果想保留引用其他枚举的写法,只需显式提取目标枚举的字符串值:
import enum class OtherTest(str, enum.Enum): CLIP = "clip" class Test(str, enum.Enum): PACK = "pack" CLIP = OtherTest.CLIP.value # 提取枚举实例的字符串值 print("clip" in (Test.PACK, Test.CLIP)) # 输出: True
内容的提问来源于stack exchange,提问作者Jason C
相关产品推荐
相关产品推荐

