python - 递归地为 self 中的每个对象生成哈希
问题描述
def __hash__(self):
"""Creating hash for item"""
if isinstance(self.get_values(), (tuple, list)):
return tuple([self.__hash__() for e in self.get_values()])
elif not isinstance(self.get_values(), dict):
return hash(self.get_values())
new_o = copy.deepcopy(self.get_values())
for k, v in new_o.items():
new_o[k] = self.__hash__()
我有自定义递归哈希函数。Self.get_values()
包含一个dicts列表。我想迭代self的每个对象并对其进行哈希处理。问题是,然后我打电话new_o[k] =self.__hash__()
给例如,
我想要类似的东西self.__ hash__(v)
,v 可以是一个列表,我想调用我的自定义哈希函数。
取而代之的是,它再次为整个自我调用哈希,我得到递归错误。我做不到 like new_o[k] = hash(v)
,因为它适用于这种类型的散列函数。
解决方案
当迭代列表/元组或项目时,您需要在迭代对象上调用 hash 方法,您一直在调用self
哪个实例上调用该方法
[e.__hash__() for e in self.get_values()] # for list/tuple
new_o[k] = v.__hash__() # for k,v
给:
def __hash__(self):
"""Creating hash for item"""
if isinstance(self.get_values(), (tuple, list)):
return tuple([e.__hash__() for e in self.get_values()])
elif not isinstance(self.get_values(), dict):
return hash(self.get_values())
new_o = copy.deepcopy(self.get_values())
for k, v in new_o.items():
if v: # handle empty and None
new_o[k] = v.__hash__()
推荐阅读
- django - Gunicorn for Django 的 systemd 服务
- python - 我有一个矩阵,其中每个元素都是一个标签和一个值。我如何表示它以便标签给出颜色和强度值?
- unity3d - 如何在检查器中为 OnClick 重新排序侦听器?
- git - 如何在工作树中“git reset”?
- javascript - 如何在不创建新的类实例的情况下从另一个类调用我的非静态函数?- 反应本机路由器通量
- vstest - VSTest:命令测试程序集的执行
- c++ - Windows (COM) API 在没有特定库的情况下表现不同
- unity3d - Unity2D 不一致的 AddForce
- ios - PDFAnnotation 有监听器吗?
- php - 如何在单个数组中添加值(用于解析)