什么是正确和好的实施方式__hash__()?
我在谈论返回哈希码的函数,该哈希码随后用于将对象插入哈希表,即字典.
当__hash__()返回一个整数并用于将对象"分箱"为哈希表时,我假设返回的整数的值应该为公共数据均匀分布(以最小化冲突).获得这些价值观的好习惯是什么?碰撞是一个问题吗?在我的例子中,我有一个小类,它充当一个容器类,包含一些int,一些浮点数和一个字符串.
我是PyCharm新手,但是长期使用IntelliJ用户.在IntelliJ中,当您编写类定义时,IDE可以基于实例变量自动生成构造函数,equals()方法和hashCode()方法.这是好事,不仅对保存打字,但为了防止意外的错误,并在某些自动投掷equals()和hashCode()最佳实践.
鉴于产品来自同一家公司,我希望PyCharm能做同样的事情.经过大量的谷歌搜索和搜索文档,我找不到任何东西__eq__()或__hash__().当然,Python实例变量没有明确指定,但我希望生成器可以遵循一个约定,例如提供所有__init()__参数作为潜在的实例变量.至于__init__(),我发现了一些会自动添加实例变量设置的东西__init__(),但是这种方法似乎比单独输入更麻烦,而且它甚至不会将实例变量作为参数添加到__init__()签名中.
我是否遗漏了文档中的任何内容,或者可能有一个可以执行此操作的插件?
更新:要清楚,我正在寻找能够生成这些方法的实际实现的东西.也就是说,如果我有称为类Point和PyCharm知道我的学生都x和y实例变量,那么它会自动生成该的__eq__()方法:
def __eq__(self, other):
if not isinstance(other, Point):
return NotImplemented
elif self is other:
return True
else:
return self.x == other.x and self.y == other.y
Run Code Online (Sandbox Code Playgroud)
在IntelliJ中可以轻松完成等效操作.
我想将NetworkX Graph对象用作Python中的键dict.但是,我不希望比较的默认行为(即,通过对象的地址).相反,我希望同构图指代是相同元素的关键dict.
这种行为是否已在某处实施?我找不到这个方向的任何信息.
如果我必须自己实施,以下评估是否现实?
networkx.Graph上课.__eq__它调用is_isomorphic.__hash__以某种方式定义(欢迎建议).我认为我必须使这个包装的Graph不可变,因为:
如果一个类定义了可变对象并实现了一个
__eq__()方法,那么它就不应该实现__hash__(),因为hashable集合的实现要求一个键的哈希值是不可变的(如果对象的哈希值改变,它将在错误的哈希桶中).
在python中散列层次结构(类似于文件结构)的好方法是什么?
我可以将整个层次结构转换为虚线字符串,然后将其哈希,但有没有更好(或更有效)的方式来做到这一点,而不是一直来回?
我可能想要散列的结构示例如下:
a -> b1 -> c -> 1 -> d
a -> b2 -> c -> 2 -> d
a -> c -> 1 -> d
Run Code Online (Sandbox Code Playgroud) python ×4
hash ×2
dictionary ×1
hashcode ×1
hashtable ×1
isomorphism ×1
networkx ×1
pycharm ×1