我正在尝试创建以下内容:
dictionary = {
'key1': ['val1','val2'],
'key2': @key1
}
其中@ key1引用字典['key1']。 提前谢谢。
答案 0 :(得分:4)
使用新课程:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
请注意奇怪的语法,因为您无法知道要创建的字典DictRef
。
答案 1 :(得分:4)
我将扩展Aaron Digulla的版本。他现在所拥有的内容在此重复:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
我认为他希望复制真正的引用语义,因此访问'key2'
将始终为您提供一种方法来获取'key1'
作为值的任何内容。问题是,d['key1']
是list
,d['key2']
是DictRef
。因此,要获得'key1'
的“价值”,您需要做的只是d['key1']
,但对于'key2'
,您必须d[d['key2'].key]
。此外,您不能引用一个有效的引用,它将成为d[d[d['key2'].key].key]
。您如何区分参考值和常规值?可能通过使用isinstance(v,DictReference)(ew)进行类型检查。
所以我有一个提议要解决所有问题。
就个人而言,我不明白为什么真正的引用语义是必要的。如果它们看起来是必要的,则可以通过重构问题或解决问题来使它们变得不必要。甚至可能是他们从来没有必要,简单的d.update(key2=d['key1'])
就可以解决问题。
无论如何,提案:
class DictRef(object):
def __init__(self, d, key):
self.d = d
self.key = key
def value(self):
return self.d[self.key].value()
class DictVal(object):
def __init__(self, value):
self._value = value
def value(self):
return self._value
d = {}
d.update(
key1=DictVal(['val1', 'val2']),
key2=DictRef(d, 'key1')
)
现在,为了获得任何键的值,无论它是否为引用,都只需d[k].value()
。如果有引用的引用,它们将在链中正确解除引用。如果它们形成一个非常长或无限的链,Python将失败并出现RuntimeError以进行过度递归。