[pyar] variable que referencia a otra

Javier Marcon javiermarcon en gmail.com
Jue Mar 20 16:22:18 ART 2014


El 20/03/14 14:17, Roberto Alsina escribió:
> On 20/03/14 14:05, Javier Marcon wrote:
>> El 20/03/14 10:02, Facundo Batista escribió:
>>> 2014-03-20 9:35 GMT-03:00 Javier Marcon <javiermarcon en gmail.com>:
>>>
>>>> Gracias a todos. Que es lo malo de tener un diccionario que sea una
>>>> referencia a datos de un diccionario recursivo? Cual es la forma que
>>> Eso no suena malo, parece de lo más normal.
>>>
>>> Lo que es raro es que lo quieras hacer con *variables*.
>>>
>> En realidad yo lo quiero hacer con una lista que cada elemento de la
>> lista referencie a un elemento de un diccionario recursivo. Por ejemplo:
>>
>> Por ejemplo yo tengo esto:
>>
>> datos = {
>>      "a": "pepe",
>>      "b": {"b1": "casa", "b3": "ojota", "b4":
>>          [{"asd": {"aaa": 1, "bbb": False}}, {"dss": "asdf"}]},
>>      "d": {"rrr": True, "jj": 9}
>> }
>>
>> def retrieve(parametros=(), datos={}):
>>      z = ()
>>      for x in parametros:
>>          z = z + (datos[x], )
>>      return z
>>
>> print retrieve( ("a","b[b1]"), datos )
>> print retrieve( ("b[b4][0][asd][bbb]","d[jj]"), datos )
>>
>> Pero al correrlo me da error cauando quiere hacer el primer print:
>>          z = z + (datos[x], )
>> KeyError: 'b[b1]'
>>
>> Como puedo hacer eso pero para que funcione?
>
> En realidad lo que queres son árboles :-)
>
> Pero burno, primero, fijate que para obtener 'casa', lo que queres es
>
> >>> datos['b']['b1']
> 'casa'
>
> Yo usaría como parametros una tupla de listas, como (['a'], ['b',
> 'b1']) y definiría una funcioncita que hace las dereferencias (no lo
> probé):
>
>
> def deref (l):
>     v = datos
>     while l:
>         k = pop(l)
>         v = v[k]
>     return v
>
> De esa manera, si en retrieve haces deref(('b', 'b1)) te deberia
> devolver 'casa'
>
> Se podría hacer manteniendo la sintaxis que te gusta en los parametros
> usando eval y cosas asi, pero estas manipulando el scope de tu funcion
> y eso es una receta para romper todo en maneras imprevisibles. Mejor
> mantener los datos como datos.
>
> De todas formas, me huele muy feo que tengas los parámetros en ese
> formato, creo que todo este código es simplemente tratar de hacer
> funcionar algo con unos datos de entrada muy raros.
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
Gracias a todos, usé lo que me dijo Roberto pero lo modifique un poco
para que funcione. Les paso el código poara que quede en el historial de
la lista así si alguien mas tiene un problema similar puede encontrar
esta respuesta.

datos = {
    "a": "pepe",
    "b": {"b1": "casa", "b3": "ojota", "b4":
        [{"asd": {"aaa": 1, "bbb": False}}, {"dss": "asdf"}]},
    "d": {"rrr": True, "jj": 9}
}

def retrieve(parametros=()):
    z = ()
    for l in parametros:
        v = datos
        for x in l:
            v = v[x]
        z = z + (v, )
    return z

def deref(l):
    v = datos
    for x in l:
        v = v[x]
    #v = v[k]
    return v

print deref(('b', 'b1'))
print retrieve( (("a"), ("b","b1")) )
print retrieve( (("b","b4",0,"asd", "bbb"),("d","jj")) )
print datos

Salu2,

Javier.


More information about the pyar mailing list