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

如何通过类作为字典键取值?解决TypeError: unhashable type问题

解决TypeError: unhashable type: 'FirstClass'问题

错误原因

你的字典MAPPER中,键是类本身(FirstClass、SecondClass),但循环里你传入的是类的实例对象(比如FirstClass(name="default_name"))去查找,两者类型不匹配。虽然报错提示“不可哈希类型”,但实际上dataclass生成的类实例默认是可哈希的(只要字段都是可哈希类型,比如这里的str),真正问题是键的类型不对。

解决方案

方法1:通过实例获取所属类来匹配字典键

修改循环内的代码,用实例的__class__属性获取它所属的类,再去字典中查找:

from dataclasses import dataclass

@dataclass
class FirstClass():
    name: str

@dataclass
class SecondClass():
    name: str

MAPPER = {FirstClass: 888, SecondClass: 999}

itr_list = [FirstClass(name="default_name"), SecondClass(name="default_name")]

for itr in itr_list:
    get_key = MAPPER[itr.__class__]
    print(get_key)  # 依次输出888、999

itr.__class__会直接返回实例对应的类对象,和MAPPER中的键类型完全一致,因此能正确匹配取值。

方法2:直接用实例作为字典键(如果业务需要)

如果你本来就希望用实例作为键,只需调整MAPPER的键为实例即可。由于dataclass默认生成的实例是可哈希的(字段为不可变类型时),可以直接使用:

from dataclasses import dataclass

@dataclass
class FirstClass():
    name: str

@dataclass
class SecondClass():
    name: str

# 用实例作为键
MAPPER = {
    FirstClass(name="default_name"): 888,
    SecondClass(name="default_name"): 999
}

itr_list = [FirstClass(name="default_name"), SecondClass(name="default_name")]

for itr in itr_list:
    get_key = MAPPER[itr]
    print(get_key)  # 依次输出888、999

注意:这种方式下,只有当实例的所有字段值完全一致时,才会被视为同一个键。

内容的提问来源于stack exchange,提问作者Chaban33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:54:28