我想將對象用作字典中的鍵,但是我想丟失對象字段之一的鍵的標識。重載散列和相等函數是微不足道的,並且按預期工作,但我無法找到在字典中使用字段類型插入的鍵的解決方案。來自對象字段的字典鍵
下面是一個例子:
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