【发布时间】:2014-06-11 18:20:09
【问题描述】:
我已经看到很多关于__eq__、__hash__ 及其关系的问题,尽管我遇到了一个令人惊讶的现象,但我想澄清一下。
我有一本字典 team,其中包含许多 player 实例作为其键。 player 类本身是相当复合的,但包括__hash__ 和__eq__。我还可能注意到player 包含作为字典的属性,我认为这是导致问题的原因。
无论如何,我的代码如下:
if player in team.keys():
name, height = team[player]
奇怪的现象是,虽然player in team 返回True(因此条件满足并执行下一行),但第二行引发KeyError。我无法弄清楚 in 是如何运作良好的,而密钥没有正确散列。
有什么建议吗?
编辑:
player 类包括以下魔术方法。 cnfg_dict 是一个包含多个用户指定配置的字典,其中required_attrs 用于区分player 实例(据称...)。
def __init__(self, cnfg_dict):
self.config_dict = cnfg_dict
self.required_attrs = ['attr1', 'attr2']
def __eq__(self, other):
return all([self.config_dict[attr] == other.config_dict[attr] for attr in self.required_attrs])
def __ne__(self, other):
required_attrs = ['dt', 'author']
return any([self.config_dict[attr] != other.config_dict[attr] for attr in required_attrs])
def __repr__(self):
return str([str(a)+'='+str(self.config_dict[a]) for a in self.required_attrs])
def __hash__(self):
return hash(repr(self))
【问题讨论】:
-
你没有使用
player in team;你正在使用player in team.keys();这仅测试列表中的相等性(至少在 Python 2 中)。这确实表明您的对象具有不正确的__hash__实现(相等的对象必须具有相等的__hash__值)。 -
您能否向我们展示您的
__hash__和__eq__实现?或者,至少是您问题的可重现简化版本。