Je développerais la version d'Aaron Digulla. Ce qu'il a est reproduit ici:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
Je suppose qu'il souhaite reproduire la véritable sémantique de référence, de sorte que l'accès 'key2'
vous donnera toujours un moyen d'arriver à ce que 'key1'
a comme valeur. le problème est tandis que d['key1']
est un list
, d['key2']
est un DictRef
. Donc, pour obtenir la "valeur" de 'key1'
tout ce que vous devez faire est d['key1']
, mais pour 'key2'
vous devez faire d[d['key2'].key]
. En outre, vous ne pouvez pas avoir de référence à une référence qui fonctionne correctement, elle deviendra d[d[d['key2'].key].key]
. Et comment différenciez-vous une référence d'une valeur régulière? Probablement par typochecking avec isinstance (v, DictReference) (ew).
J'ai donc une proposition pour résoudre tout cela.
Personnellement, je ne comprends pas pourquoi la véritable sémantique de référence est nécessaire. Si elles apparaissent nécessaires, elles peuvent être rendues inutiles en restructurant le problème ou en résolvant le problème. Il se peut même qu'ils n'aient jamais été nécessaires, et un simple d.update(key2=d['key1'])
aurait résolu le problème.
Quoi qu'il en soit, la proposition:
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')
)
Maintenant, afin d'obtenir la valeur de toute clé, que ce soit une référence ou non, on pourra simplement faire d[k].value()
. S'il y a des références à des références, elles seront déréférencées dans une chaîne correctement. S'ils forment une chaîne vraiment longue ou infinie, Python échouera avec RuntimeError pour une récursivité excessive.
Que se passerait-il si vous faisiez quelque chose comme 'dictionary ['key1'] = 4'? Est-ce que key2 doit contenir 4 ou devrait-il toujours faire référence à la liste originale? –
Similaire à cette question, bien qu'il ait été posté plus tard: [Que dois-je faire quand j'ai besoin d'un dictionnaire auto-référentiel?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-self-referential-dictionary) –