我正在尝试创建以下内容:
dictionary = {
'key1': ['val1','val2'],
'key2': @key1
}
Run Code Online (Sandbox Code Playgroud)
其中@ key1引用了字典['key1'].先感谢您.
我会扩展 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 list,d['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 将因过度递归而失败并出现运行时错误。
| 归档时间: |
|
| 查看次数: |
3536 次 |
| 最近记录: |