擅长:python、mysql、java
<p>这里有两个问题。首先是:</p>
<pre><code>t = _CaptureEq(item)
if t in container:
return t.match
return default
</code></pre>
<p>不会做你想做的事。特别是,<code>t</code>将永远不会出现在<code>container</code>中,因为<code>_CaptureEq</code>没有定义{<cd4>}。这在Python3中变得更加明显,因为它将向您指出这一点,而不是提供默认的<code>__hash__</code>。<code>_CaptureEq</code>的代码似乎认为,提供一个<code>__getattr__</code>可以解决这个问题——它不会,因为Python的特殊方法查找不一定会像普通的属性查找一样经过所有相同的步骤——这就是为什么<code>__hash__</code>(以及其他各种方法)需要在类上定义,并且不能在实例上进行monkeypatch。因此,最直接的方法是定义<code>_CaptureEq.__hash__</code>,如下所示:</p>
^{pr2}$
<p>但这仍然不能保证有效,因为第二个问题:<code>set</code>查找不能保证测试相等性。<code>set</code>是基于哈希表的,只有在哈希桶中有多个项时才进行相等性测试。您不能(也不想)强制将哈希不同的项放入同一个bucket中,因为这是<code>set</code>的全部实现细节。首先,最简单的方法是列出:</p>
<pre><code>summary = [bar_1]
assert(bar_1 == bar_2)
bar_equiv = get_equivalent(summary, bar_2)
assert(bar_equiv is bar_1)
</code></pre>