向集合中添加Pydantic模型时出现不可哈希类型错误的解决方法
解决Pydantic模型实例无法加入集合的TypeError问题
出现TypeError: unhashable type: 'User'的原因是:集合(set)要求元素必须是可哈希的,而默认的Pydantic BaseModel实例是可变对象(支持修改属性值),这类对象默认没有有效的__hash__方法,因此无法被添加到集合中。
下面提供两种实用的解决方法:
方法一:冻结模型(推荐)
通过设置model_config = {"frozen": True}将模型设为不可变,此时Pydantic会自动为实例生成符合要求的__hash__方法,同时禁止修改实例属性:
from pydantic import BaseModel class User(BaseModel): model_config = {"frozen": True} id: int name = "Jane Doe" def add_user(user: User): a = set() a.add(user) return a add_user(User(id=1))
方法二:手动实现__hash__方法
如果需要保持模型实例的可变性,可以手动基于实例的唯一标识字段(比如id)实现__hash__方法,同时建议同步重写__eq__方法,保证相等判断与哈希逻辑一致:
from pydantic import BaseModel class User(BaseModel): id: int name = "Jane Doe" def __hash__(self): # 基于唯一标识id生成哈希值 return hash(self.id) def __eq__(self, other): if not isinstance(other, User): return False # 仅通过id判断两个User实例是否相等 return self.id == other.id def add_user(user: User): a = set() a.add(user) return a add_user(User(id=1))
两种方法的选择:
- 若你的业务场景不需要修改已创建的User实例,优先使用方法一,代码更简洁且符合Pydantic的设计规范。
- 若必须保留实例的可变性,再考虑方法二,自定义哈希和相等逻辑。
内容的提问来源于stack exchange,提问作者some_programmer
相关产品推荐
相关产品推荐

