如何判断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
相关产品推荐
相关产品推荐

