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

如何判断Pydantic模型实例是否存在于包含该模型实例的Enum中?

如何判断Pydantic模型实例是否存在于包含该模型实例的Enum中?

这个问题的核心在于Python Enum默认的成员检查逻辑——它判断的是你传入的对象是否是Enum成员本身,而不是成员对应的值是否和传入对象相等。你已经通过重写__eq__让模型实例的相等性符合预期,但Enum的in操作符并没有复用这个逻辑,所以才会抛出TypeError(本质是默认的in检查无法处理模型实例和Enum成员的比较)。

这里有两种简单的解决方案:

方案一:手动遍历Enum成员的值进行检查

直接用any()生成器遍历所有Enum成员,比较它们的value属性和你的模型实例是否相等,这是最直观的方式:

target_model = MyGenericModel(value_one="a", value_two="b")
if any(item.value == target_model for item in MyEnum):
    print("模型实例存在于Enum中")
else:
    print("模型实例不存在于Enum中")

方案二:给Enum类自定义__contains__方法

如果你希望保留in语法的简洁性,可以给你的MyEnum类添加一个类方法__contains__,让它按照值的相等性来判断成员是否存在:

from pydantic import BaseModel
from enum import Enum


class MyGenericModel(BaseModel):
    value_one: str
    value_two: str
    
    def __eq__(self, other):
        return self.model_dump() == other.model_dump()


class MySpecificModel(MyGenericModel):
    value_one: str = "a"
    value_two: str = "b"


class MyEnum(Enum):
    my_model = MySpecificModel()

    @classmethod
    def __contains__(cls, item):
        # 遍历所有Enum成员,比较成员的值和传入对象
        return any(member.value == item for member in cls)


# 现在这行代码会返回True
print(MyGenericModel(value_one="a", value_two="b") in MyEnum)

因为你已经在MyGenericModel中重写了__eq__方法,这两种方案都会自动复用你定义的相等逻辑,完美匹配你的需求。

备注:内容来源于stack exchange,提问作者zwep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:43:10