2016-01-21 238 views
2

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

下面是一個例子:

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

+2

Uuuum'd [富(3).VAL] =「bar''第二項? – RickyA

+3

您是否希望'Foo'實例在用作鍵時自動成爲'int'?或者你只是想改變'print'給出的輸出? –

+0

@AndreaCorbellini準確地說,我希望Foo實例在用作鍵時自動成爲一個int。我會澄清我的問題。 – uzpe

回答

3

明確優於隱式。 在這種情況下,它意味着使用整數作爲關鍵字,而不是期望對象在此上下文中「變成」整數。

拿RickyA的建議。

d[Foo(3).val] = 'bar' 

Zen of Python

+0

我會接受這個答案,因爲這是我已經在做的事情,似乎沒有更好的解決方案。 – uzpe