从对象字段的字典键

时间:2016-01-21 14:02:48

标签: python dictionary

我想将一个对象用作字典中的键,但我希望丢失一个对象字段的键的标识。重载哈希和相等函数是微不足道的,并按预期工作,但我无法找到一个解决方案,用于在字典中插入字段类型的键。

以下是一个例子:

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

1 个答案:

答案 0 :(得分:3)

显式优于隐式。 1 在这种情况下,它意味着使用整数作为键而不是期望对象在此上下文中“变成”整数。

接受RickyA的建议。

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

1 Zen of Python

中的第二项