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

向集合中添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:22:48