[pyar] variable que referencia a otra

Roberto Alsina ralsina en netmanagers.com.ar
Jue Mar 20 14:17:27 ART 2014


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.


More information about the pyar mailing list