Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-12 Por tema Garito
Hola Alexis!
En realidad lo que busco es poder hacer con un diccionario lo que se puede
hacer en un entorno web: utilizar urls para los getters y los setters igual
que utilizo urls para los GET y POST del web

Mi intencion de que sean tan recursivos como se pueda es porque en un arbol
en el que se defina el nodo como clase si que hay una ventaja muy grande al
hacerlos recursivos y un diccionario es el arbol mas simple que existe para
python

Yo, en mi estilo que programacion, quiero poder usar

a['a/b/c'] = 'un valor'
a['a/b/c'] - 'un valor'
hasattr('a/b/c') - True

y poco mas

A tus preguntas:

'a/b' in d - False puesto que d no es ni un contenido de a y b. En todo
caso 'c' in d['a/b'] seria True

d.get('a/b') es una construccion que no utilizo pero supongo que igual que
una vez hecho el __getitem__ hacer el getattr es sobre cargar el __missing__
llamando al __getitem__ ya definido, intuyo que se puede hacer lo mismo con
el get utilizando 2 lineas de codigo (algo asumible)

def get(self, valor):
  return self.__getitem__(valor)

d.keys() - ['a'] puesto que el primer nivel del arbol solo contiene a. Lo
que si que querria seria d['a/b'].keys() - ['c']

d.values() - [{'b': {'c': 'un valor'}}] igual que devolveria un dict normal

Si d['x/y'] = {'foo': 'bar'} entonces d['x/y/foo'] == 'bar' - True puesto
que el valor para la url x/y/foo en ese diccionario es bar

Como puedes ver mi yDict se comportaria exactamente igual que un diccionario
pero en los getter y setter quiero tener la opcion de que se comporten como
un servidor web pues eso es lo que estoy programando

Quiero poder utilizar la frase de que TODO ES UNA URL

Y en cuanto a la recursividad en este caso las ventajas en un diccionario
son poco claras puesto que el codigo resultante de hacerlo recursivo a no
hacerlo es practicamente del mismo tamaño (que no complejidad)

Entonces porque recursivo? Porque el arbol es un fractal y el mecanismo de
fractalidad en la programacion es la recursividad pero este concepto no es
el que mas solemos dominar los programadores asi que cuanto mas y mas
profundamente este implementado este concepto mas natural acabara siendo (un
solo modo de pensar es mas simple que varios)

En cuanto a la programacion de un servidor web recursivo la cosa cambia pues
la diferencia de cantidad de codigo y de complejidad si que son muy
diferentes de programarlo de una forma u otra (y, en este caso, la
recursividad gana de goleada una vez integrado el concepto en nuestro coco)

Despues de 7 años reprogramando mi manera de ver las cosas en la informatica
(y en la vida), el fractal arbol emergio con tanta potencia que no tengo
ninguna duda de lo que estoy diciendo (tendrias que ver los codigos que
llegue a hacer antes de darme cuanta de esto! Y tu, en concreto, ya
estuviste en contacto con esta busqueda en la lista de zope! Y ya entonces
me decias que igual deberia cambiar mi forma de ver las cosas!!! ;) )

Pues te parecera una chorrada y/o una frivolidad pero es que he llegado a
soñar con el codigo cuando estuviese escrito del todo!!! Y era
recursivo!! (no se me quita de la cabeza la parte en que aparecia self()
en el sueño)

Que me puedo estar equivocando? SI!!! puede ser. Pero deberias ver lo bien
que se programa cuando utilizas un arbol como codigo fuente!! -
http://www.flickr.com/photos/92578...@n00/tags/yanged/

Y las pedazo de ventajas que tiene para programar!!! Y para grupos de
trabajo distribuidos!!! Estuve haciendo un arbol con un amigo en
http://www.mindmeister.com/ con el colega al Skype y los dos modificando el
arbol a la vez y en 1/2 hora teniamos hecho el trabajo de 4!

Como voy a dejar esta manera de pensar cuando no paran de surgir nuevas
ventajas dia tras dia???!!!
Como voy a dejar esta manera de pensar cuando los cientificos no paran de
encontrar fractales en la realidad???!!!
La realidad misma es un fractal!!!

Saludos y muchisimas gracias por tu interes. Si huviese tenido una charla
asi hace 6 años ahora haria ese tiempo que Yanged (mi proyecto) seria una
tecnologia mas del ecosistema actual

El 12 de octubre de 2010 14:50, Alexis Roda 
alexis.roda.villalo...@gmail.com escribió:

 En/na Garito ha escrit:

 Eso es justo lo que me queria evitar con un casting pero parece que eso no
 es posible en python, cierto?


 Podria ser esto otra forma:

 En el __setitem__ del yDict habria que poner un trozo de codigo que
 recorriese los dict para convertirlos a yDict


 Debería funcionar, pero la clase se está volviendo más compleja e
 ineficiente cada vez y la cosa no termina aquí. Si d es un yDict y
 d[a/b/c] = d

 * cual es el resultado de a/b in d ? Si la respuesta es True debes
 redefinir el método __contains__

 * d.get(a/b) devuelve el yDict {c:d} ? Si la respuesta es sí debes
 redefinir el método get

 * d.keys() devuelve [a], [a/b/c] o [a, a/b, a/b/c] ? Si la
 respuesta no es [a] debes redefinir el método.

 * que devuelve d.values(), los values de primer nivel ? los finales ?

 * que ocurre si haces d[x/y] = { foo 

Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-11 Por tema Alexis Roda

En/na Garito ha escrit:

yDict({a: {b: {c: abc}}}) - {'a': {'b': {'c': 'abc'}}}


Para que yDict funcione todo valor que no sea final debe ser a su vez 
un yDict (es una estructura recursiva). Si pasas una serie de 
diccionarios anidados al constructor este no los convierte en yDict.


Para verlo más claro añade el método:

def __repr__(self) :
return yDict {%s} % , .join(
[%r : %r % (k, v) for k, v in self.items()]
)


In [1]: d = yDict({a: {b: {c: abc}}})
In [2]: d
Out[2]: yDict {'a' : {'b': {'c': 'abc'}}}
In [3]: dd = yDict()
In [4]: dd[a/b/c] = abc
In [5]: dd
Out[5]: yDict {'a' : yDict {'b' : yDict {'c' : 'abc'}}}

En [2] los diccionarios interiores no son instancias de yDict, en [5] 
sí. Deberás redefinir '__init__' para que la instancia se inicialice 
correctamente. También deberás redefinir el método 'setdefault' y 
posiblemente otros para garantizar que la semántica de yDict sea 
consistente.






Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-11 Por tema Garito
Eso es justo lo que me queria evitar con un casting pero parece que eso no
es posible en python, cierto?

Podria ser esto otra forma:

En el __setitem__ del yDict habria que poner un trozo de codigo que
recorriese los dict para convertirlos a yDict

Gracias!

El 11 de octubre de 2010 10:15, Alexis Roda 
alexis.roda.villalo...@gmail.com escribió:

 En/na Garito ha escrit:

 yDict({a: {b: {c: abc}}}) - {'a': {'b': {'c': 'abc'}}}


 Para que yDict funcione todo valor que no sea final debe ser a su vez un
 yDict (es una estructura recursiva). Si pasas una serie de diccionarios
 anidados al constructor este no los convierte en yDict.

 Para verlo más claro añade el método:

def __repr__(self) :
return yDict {%s} % , .join(
[%r : %r % (k, v) for k, v in self.items()]
)


 In [1]: d = yDict({a: {b: {c: abc}}})
 In [2]: d
 Out[2]: yDict {'a' : {'b': {'c': 'abc'}}}
 In [3]: dd = yDict()
 In [4]: dd[a/b/c] = abc
 In [5]: dd
 Out[5]: yDict {'a' : yDict {'b' : yDict {'c' : 'abc'}}}

 En [2] los diccionarios interiores no son instancias de yDict, en [5] sí.
 Deberás redefinir '__init__' para que la instancia se inicialice
 correctamente. También deberás redefinir el método 'setdefault' y
 posiblemente otros para garantizar que la semántica de yDict sea
 consistente.






 Saludos
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/




-- 
Mi twitter: http://twitter.com/garito

Temet nosce
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-09 Por tema Alexis Roda

En/na Garito ha escrit:

Me gustaria que el acceso a estas funciones sea recursivo


¿ por algún motivo en especial ?

 La pregunta seria: hay alguna forma de cambiarle el tipo
 (momentaneamente) sin crear otro objeto? O dicho de otra forma: puedo
 hacer un cast momentaneo?

Creo que lo que buscas es 'super':

class yDict(dict) :
def __getitem__(self, clave):
partes = clave.split('/', 1)
if len(partes)  1 :
return super(yDict, self).__getitem__(partes[0])[partes[1]]
else:
return super(yDict, self).__getitem__(partes[0])

def __setitem__(self, clave, valor) :
partes = clave.split(/, 1)
if len(partes)  1 :
super(yDict, self).setdefault(partes[0], 
yDict())[partes[1]] = valor

else :
super(yDict, self).__setitem__(partes[0], valor)

¿Que debería ocurrir con este código?

d = yDict()
d[a/b] = 1
d[a/b/c] = 2



Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-09 Por tema Garito
El 9 de octubre de 2010 23:13, Alexis Roda alexis.roda.villalo...@gmail.com
 escribió:

 En/na Garito ha escrit:

  Me gustaria que el acceso a estas funciones sea recursivo


 ¿ por algún motivo en especial ?

 Si, claro. Desde mi analisis la naturaleza es claramente fractal y la base
para la fractalidad es la recursividad
Ahorra codigo y convierte el que pones en algo donde la responsabilidad bien
colocada es un gol extra


  La pregunta seria: hay alguna forma de cambiarle el tipo
  (momentaneamente) sin crear otro objeto? O dicho de otra forma: puedo
  hacer un cast momentaneo?

 Creo que lo que buscas es 'super':

 class yDict(dict) :
def __getitem__(self, clave):
partes = clave.split('/', 1)
if len(partes)  1 :
return super(yDict, self).__getitem__(partes[0])[partes[1]]
else:
return super(yDict, self).__getitem__(partes[0])

def __setitem__(self, clave, valor) :
partes = clave.split(/, 1)
if len(partes)  1 :
super(yDict, self).setdefault(partes[0], yDict())[partes[1]] =
 valor
else :
super(yDict, self).__setitem__(partes[0], valor)


Podria ser perfectamente, revisare este codigo a ver que me surge, gracias!


 ¿Que debería ocurrir con este código?

 d = yDict()
 d[a/b] = 1


d = {'a': {'b': 1}}


 d[a/b/c] = 2


d = {'a': {'b': {'c': 2}}}

Gracias por tu ayuda, parece que tu y yo seguimos teniendo esa relacion de
siempre en estas listas
Saludos






 Saludos

 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/




-- 
Mi twitter: http://twitter.com/garito

Temet nosce
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/