QTreeWidgetItem为不可哈希类型 如何正确反转字典将其设为键
报错原因
Python 字典要求键必须是*可哈希(hashable)*的类型,核心要求是对象有唯一固定的哈希值。QTreeWidgetItem 是Qt框架的可变GUI对象,默认没有实现哈希方法,因此无法直接作为字典的键使用,才会触发该类型错误。
解决方案
方案1:自定义继承QTreeWidgetItem实现哈希逻辑
如果可以修改项目中item的创建逻辑,直接继承QTreeWidgetItem自定义类,添加哈希方法即可:
from PyQt5.QtWidgets import QTreeWidgetItem class HashableTreeWidgetItem(QTreeWidgetItem): def __hash__(self): # 直接返回实例的内存id作为唯一哈希值,也可替换为业务中的唯一标识字段 return id(self) # 可选:实现相等判定方法,配合哈希做键的唯一性校验 def __eq__(self, other): return isinstance(other, HashableTreeWidgetItem) and id(self) == id(other)
后续创建条目时用HashableTreeWidgetItem替换原生QTreeWidgetItem,就可以直接用字典推导式完成键值反转:
inv_dict = {v:k for k,v in my_dict.items()}
方案2:兼容原生QTreeWidgetItem的实现方式
如果不能修改原有条目的创建逻辑,有两种可选实现:
- 用实例id做中间映射,封装查找逻辑:
# 构造id到dataBlock的映射表 id_to_datablock = {id(v):k for k,v in my_dict.items()} # 查找时传入item实例即可 def get_datablock(item): return id_to_datablock.get(id(item))
- 用
weakref.WeakKeyDictionary直接实现可变对象为键的字典,无需修改原有逻辑:
from weakref import WeakKeyDictionary inv_dict = WeakKeyDictionary() for k, v in my_dict.items(): inv_dict[v] = k # 使用方式和普通字典完全一致 # 示例:inv_dict[item1] 可直接获取对应的dataBlock1
注意:
WeakKeyDictionary对键是弱引用,当QTreeWidgetItem被Qt销毁后会自动从字典中移除对应条目,不会出现野指针和内存泄漏问题,是该场景下的最优选择。
内容的提问来源于stack exchange,提问作者Bebe Win
相关产品推荐
相关产品推荐

