Types that define `__eq__` are unhashable?
当我将一个特性移植到我的程序的python 3.1分支时,我遇到了一个奇怪的错误。我把范围缩小到以下假设:
与python 2.x不同,在python 3.x中,如果一个对象有一个
这是真的吗?
下面是在python 3.1中发生的事情:
1 2 3 4 5 6 7 8 9 10 | >>> class O(object): ... def __eq__(self, other): ... return 'whatever' ... >>> o = O() >>> d = {o: 0} Traceback (most recent call last): File"<pyshell#16>", line 1, in <module> d = {o: 0} TypeError: unhashable type: 'O' |
接下来的问题是,我该如何解决我的个人问题?我有一个对象
是的,如果定义
解决方案很简单:只需定义
本段来自http://docs.python.org/3.1/reference/datamodel.html object.hash
If a class that overrides
__eq__()
needs to retain the implementation of
__hash__() from a parent class, the interpreter must be told this
explicitly by setting__hash__ = . Otherwise the
.__hash__
inheritance of__hash__() will be
blocked, just as if__hash__ had been
explicitly set to None.
号
查看
If a class does not define an
__eq__() method it should not define a__hash__() operation either; if it defines__eq__() but not__hash__() , its instances will not be usable as items in hashable collections.
号
重点是我的。
如果你想懒惰,听起来你可以定义
User-defined classes have
__eq__() and__hash__() methods by default; with them, all objects compare unequal (except with themselves) andx.__hash__() returnsid(x) .
号
我不是Python专家,但在定义eq方法时,也必须定义哈希方法(它计算对象的哈希值),这是否有意义呢?否则,哈希机制就不知道它是命中同一对象,还是只命中具有相同哈希值的不同对象。实际上,它是相反的,它最终可能会为被您的
我不知道这个哈希函数叫什么,可能是