Expandiría la versión de Aaron Digulla. Lo que ahora se ha replicado está aquí:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
Asumo que desea replicar verdaderos semántica de referencia, por lo que el acceso a 'key2'
siempre te dará una forma de llegar a lo 'key1'
tiene como valor. el problema es mientras d['key1']
es un list
, d['key2']
es un DictRef
. Entonces para obtener el "valor" de 'key1'
todo lo que necesita hacer es d['key1']
, pero para 'key2'
debe hacer d[d['key2'].key]
. Además, no puede tener una referencia a una referencia que funcione sanamente, se convertiría en d[d[d['key2'].key].key]
. ¿Y cómo se diferencia entre una referencia y un valor normal? Probablemente a través de la verificación de tipo con isinstance (v, DictReference) (ew).
Así que tengo una propuesta para arreglar todo esto.
Personalmente, no entiendo por qué es necesaria la verdadera semántica de referencia. Si parecen necesarios, pueden hacerse innecesarios mediante la reestructuración del problema o la solución del problema. Incluso puede ser que nunca fueron necesarios, y un simple d.update(key2=d['key1'])
habría resuelto el problema.
De todos modos, la propuesta:
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')
)
Ahora, con el fin de obtener el valor de cualquier tecla, si se trata de una referencia o no, uno podría simplemente hacer d[k].value()
. Si hay referencias a referencias, serán desreferenciadas en una cadena correctamente. Si forman una cadena realmente larga o infinita, Python fallará con un RuntimeError por recursión excesiva.
¿qué pasaría si haces algo como 'dictionary ['key1'] = 4'? ¿Debería key2 contener 4 o debería seguir haciendo referencia a la lista original? –
Similar a esta pregunta, aunque fue publicada más tarde: [¿Qué hago cuando necesito un diccionario autorreferencial?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-auto-referential-dictionary) –