如何通过类作为字典键取值?解决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
相关产品推荐
相关产品推荐

