当我将一个特性移植到我的 Python 3.1分支程序时,我遇到了一个奇怪的 bug。我把范围缩小到以下假设:
与 Python 2.x 不同,在 Python 3.x 中,如果一个对象有一个 __eq__
方法,那么它就是自动取消散列的。
这是真的吗?
下面是 Python 3.1中发生的事情:
>>> 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'
接下来的问题是,我该如何解决我的个人问题?我有一个对象 ChangeTracker
,它存储一个指向多个对象的 WeakKeyDictionary
,为每个对象提供它们在过去某个时间点的 pickle 转储的值。无论何时签入现有对象,更改跟踪器都会说明其新 pickle 是否与旧 pickle 相同,从而说明该对象是否在此期间发生了更改。问题是,现在我甚至不能检查给定的对象是否在库中,因为它会引发一个关于该对象不可散列的异常。(因为它有一个 __eq__
方法。)我该怎么办?