[Python-es] Equivalente a __missing__ para el setter

Garito garito en gmail.com
Mar Oct 12 19:24:46 CEST 2010


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/92578281@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.villalonga en 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" : "bar" } ? d["x/y/foo"] == "bar"
> o dispara un KeyError ?
>
>
> El uso de una estructura recursiva introduce una sobrecarga importante: por
> un lado se realizan un montón de llamadas a funciones y por otro debes
> garantizar que la estructura siga siendo recursiva al modificarla.
>
>
> Llegado a este punto me plantearía si vale la pena seguir por este camino:
>
> * ¿ realmente necesitas que yDict implemente toda la interfaz de un
> diccionario ?
>
> * ¿ es imprescindible utilizar recursividad ?
>
>
>
>
>
> Saludos
> _______________________________________________
> Python-es mailing list
> Python-es en 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20101012/427dd4ae/attachment.html>


Más información sobre la lista de distribución Python-es