我想将对象用作字典中的键,但是我想丢失对象字段之一的键的标识。重载散列和相等函数是微不足道的,并且按预期工作,但我无法找到在字典中使用字段类型插入的键的解决方案。来自对象字段的字典键
下面是一个例子:
class Foo:
def __init__(self, val):
self.val = val
def __eq__(self, other):
if isinstance(other, self.__class__):
return self.val == other.val
elif isinstance(other, int):
return self.val == other
else:
return False
def __hash__(self):
return hash(self.val)
# this is false
print Foo(3) == Foo(4)
# this is true
print Foo(3) == Foo(3)
# this is true
print Foo(3) == 3
现在,如果我用一个Foo实例作为关键,关键的身份是一个Foo实例(如预期):
d = {}
d[Foo(3)] = 'bar'
>>> print(d)
{<__main__.Foo instance at 0x7fe47b8e0a70>: 'bar'}
什么我想是d[Foo(3)]
实际上交换int类型的密钥3
,这样字典里面没有Foo类的痕迹:
d = {}
d[Foo(3)] = 'bar'
>>> print(d)
{3: 'bar'}
d = {}
d[Foo(3)] = 'bar'
>>> print(d)
{3: 'bar'}
编辑1:作为澄清,请注意,我不关心打印语句的行为,我想要的是,正如有人将其放在下面,我的“Foo”实例在使用时会自动成为“int”关键。
编辑2:在我的情况下,该字段是一个字符串,字典最终被转储到一个json文件,该文件只能使用字符串和标量类型。我不想明确地将我的对象转换为字符串,因为它是是的一个字符串。
编辑3:不幸的是,它看起来像已经建议我以后什么(拒绝):PEP-455
Uuuum'd [富(3).VAL] =“bar''第二项? – RickyA
您是否希望'Foo'实例在用作键时自动成为'int'?或者你只是想改变'print'给出的输出? –
@AndreaCorbellini准确地说,我希望Foo实例在用作键时自动成为一个int。我会澄清我的问题。 – uzpe