2016-01-21 87 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