2

我创建了一个类,它允许我使用任意字典键存储元数据,并且仍然通过in原始对象类型的测试:

class DictKey:

    def __init__(self, key):
        self.hashkey = hash(key)
        self.member = key

    def __hash__(self):
        return self.hashkey

    def __repr__(self):
        return 'DictKey(' + self.strkey + ')'

    def __cmp__(self, o):
        return cmp(self.member, o)

d = {}
key = DictKey('hello')
d[key] = 'world'

print key.hashkey
print hash('hello')
print key in d
print 'hello' in d
print DictKey('hello') in d

产生输出:

840651671246116861
840651671246116861
True
True
True

现在,给定字符串“hello”,我需要在恒定时间内获取从所述字符串创建的 DictKey 实例:

if 'hello' in d:
    #need some way to return the instance of DictKey so I can get at it's member
    tmp = d.getkey('hello') 
    tmp.member
4

2 回答 2

2

将“元”数据与 dict 一起存储的更传统方法是:

  1. 维护两个dict具有相同键集的 s,一个用于实际数据,一个用于“元”
  2. 有一个dictwith ("raw") 键,值是 2 元组:( value, item-meta-data )

两者都很简单,不需要特殊的魔法。您还将避免像您在问题中描述的问题(以及其他问题)。

于 2013-03-29T16:57:50.607 回答
0

我对您的基本代码做了一些修改:

def __repr__(self):
    return 'DictKey(' + self.member + ')'

然后,如果您想在一组键中检索 DictKey 的实例,您可以执行以下操作:

index_of_instance = d.keys().index('hello')
my_instance_of_dict_key = d.keys()[index_of_instance]

希望能帮助到你。

于 2013-03-29T16:48:35.793 回答