You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:10:30