Python字典引用邻居字典元素

frx*_*frx 7 python dictionary

我正在尝试创建以下内容:

dictionary = {
   'key1': ['val1','val2'],
   'key2': @key1
}
Run Code Online (Sandbox Code Playgroud)

其中@ key1引用了字典['key1'].先感谢您.

Dev*_*rre 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')
})
Run Code Online (Sandbox Code Playgroud)

我假设他希望复制真实的引用语义,因此访问'key2'总是为您提供一种获取任何'key1'有价值的内容的方法。问题是 whiled['key1']是 a listd['key2']是 a 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')
)
Run Code Online (Sandbox Code Playgroud)

现在,为了获取任何键的值,无论它是否是引用,只需执行d[k].value(). 如果存在对引用的引用,它们将在链中正确取消引用。如果它们形成一个非常长或无限的链,Python 将因过度递归而失败并出现运行时错误。