我想将一个对象用作字典中的键,但我希望丢失一个对象字段的键的标识。重载哈希和相等函数是微不足道的,并按预期工作,但我无法找到一个解决方案,用于在字典中插入字段类型的键。
以下是一个例子:
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'}
编辑1:作为澄清,请注意我不关心print语句的行为,我想要的是,正如有人把它放在下面,我的&#34; Foo&#34;实例自动成为&#34; int&#34;当用作钥匙时。
编辑2:在我的情况下,字段是一个字符串,字典最终被转储到json文件,该文件只能采用字符串和标量类型。我不想将我的对象显式地转换为字符串,因为 是一个字符串。
编辑3:不幸的是,看起来我之后已经提出(并被拒绝):PEP-455
答案 0 :(得分:3)
显式优于隐式。 1 在这种情况下,它意味着使用整数作为键而不是期望对象在此上下文中“变成”整数。
接受RickyA的建议。
d[Foo(3).val] = 'bar'
中的第二项