Re: [Python-es] Convertir de mutable a inmutable

2011-04-24 Por tema Nekmo
Si usas repr no te va a funcionar. Python no es igual a la sintaxis de
Javascript (la cual es JSON). Por ejemplo, mientras que en JSON tienes
false, true y null, en Python tienes False, True y None, lo cual te
provocará a la hora de trabajar con el pseudo JSON bonitos errores
del tipo False no está definida, además de que como tengas algo que
no sea un string en la key de un diccionario, a la hora de interpretar
el JSON también te petará (en el caso de usar el módulo JSON, te
petará al dumpear xD).

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: conta...@nekmo.com
XMPP/Jabber: conta...@nekmo.com
Identi.ca: http://identi.ca/nekmo
Diaspora: Nekmo



El día 23 de abril de 2011 14:24, tny a.por...@gmail.com escribió:
 El lun, 18-04-2011 a las 18:24 +0200, Pepe Aracil escribió:
 Hola Lista.

 Tengo que cachear objetos JSON, es decir puedo encontrarme con listas y
 diccionarios
 que son mutables y por tanto al no  ser hashables no pueden formar parte
 de las keys
 de un diccionario.

 Una idea es pasar todos los objetos mutables (diccionarios y listas) a
 inmutables (tuplas)
 mediante una función recursiva.

 Ejemplo:
 {method:foo, params:[sota,caballo]}   --  ((method,foo),
 (params,(sota,caballo)))
 Este sistema se me antoja algo Gastón en cuanto a ciclos CPU

 El otro método consiste en usar la representación en cadena del objeto
 usando repr(objeto):
 repr({method:foo, params:[sota,caballo]}) - '{method:foo,
 params:[sota,caballo]}'


 ¿Alguna idea más al respecto?

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

 Voto por repr

 Y mucho mejor si deribas la clase de los objetos JSON y le añades el
 metodo hash, de modo que te cree el hash de la representación del json


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

___
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] Convertir de mutable a inmutable

2011-04-24 Por tema Pepe Aracil
Hola Nekmo.

Creo que me he explicado mal, la idea de usar repr() no es para parsear JSON
que para eso ya existe el módulo json.
Mi intención es cachear peticiones JSON/RPC  que se traducen en diccionarios
python en el lado del server. Para lo cual necesito que estos diccionarios
puedan formar parte de las keys de un diccionario que contiene los
resultados cacheados. Para tal fin hay que transformar estos diccionarios en
objetos inmutables y repr() es una de las opciones, otra podria ser Pickle.

Si las cadenas json/rpc son muy largas, simpre se pueden acortar en md5:

jsonObj = { method: echo, params: [Hello JSON-RPC], id: 1}
result = doJsonMethod(jsonObj)
hashable = md5.new(cPickle.dumps(jsonObj)).digest()
cache[hashable] = result


Salud.


El 24 de abril de 2011 12:52, Nekmo conta...@nekmo.com escribió:

 Si usas repr no te va a funcionar. Python no es igual a la sintaxis de
 Javascript (la cual es JSON). Por ejemplo, mientras que en JSON tienes
 false, true y null, en Python tienes False, True y None, lo cual te
 provocará a la hora de trabajar con el pseudo JSON bonitos errores
 del tipo False no está definida, además de que como tengas algo que
 no sea un string en la key de un diccionario, a la hora de interpretar
 el JSON también te petará (en el caso de usar el módulo JSON, te
 petará al dumpear xD).

 Un cordial saludo:
 -- Nekmo.

 Sitio web: http://nekmo.com
 Dirección de contacto: conta...@nekmo.com
 XMPP/Jabber: conta...@nekmo.com
 Identi.ca: http://identi.ca/nekmo
 Diaspora: Nekmo



 El día 23 de abril de 2011 14:24, tny a.por...@gmail.com escribió:
  El lun, 18-04-2011 a las 18:24 +0200, Pepe Aracil escribió:
  Hola Lista.
 
  Tengo que cachear objetos JSON, es decir puedo encontrarme con listas y
  diccionarios
  que son mutables y por tanto al no  ser hashables no pueden formar
 parte
  de las keys
  de un diccionario.
 
  Una idea es pasar todos los objetos mutables (diccionarios y listas) a
  inmutables (tuplas)
  mediante una función recursiva.
 
  Ejemplo:
  {method:foo, params:[sota,caballo]}   --  ((method,foo),
  (params,(sota,caballo)))
  Este sistema se me antoja algo Gastón en cuanto a ciclos CPU
 
  El otro método consiste en usar la representación en cadena del objeto
  usando repr(objeto):
  repr({method:foo, params:[sota,caballo]}) - '{method:foo,
  params:[sota,caballo]}'
 
 
  ¿Alguna idea más al respecto?
 
  Gracias.
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
  Voto por repr
 
  Y mucho mejor si deribas la clase de los objetos JSON y le añades el
  metodo hash, de modo que te cree el hash de la representación del json
 
 
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/

___
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] Convertir de mutable a inmutable

2011-04-24 Por tema Nekmo
Vale, entonces, por lo que entiendo, la idea es comparar si un
diccionario es igual a otro, ¿verdad? En tal caso, habría que tener en
cuenta que el orden de los valores puede cambiar, lo cual es un
problema... :|

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: conta...@nekmo.com
XMPP/Jabber: conta...@nekmo.com
Identi.ca: http://identi.ca/nekmo
Diaspora: Nekmo



El día 24 de abril de 2011 13:43, Pepe Aracil p...@diselpro.com escribió:
 Hola Nekmo.

 Creo que me he explicado mal, la idea de usar repr() no es para parsear JSON
 que para eso ya existe el módulo json.
 Mi intención es cachear peticiones JSON/RPC  que se traducen en diccionarios
 python en el lado del server. Para lo cual necesito que estos diccionarios
 puedan formar parte de las keys de un diccionario que contiene los
 resultados cacheados. Para tal fin hay que transformar estos diccionarios en
 objetos inmutables y repr() es una de las opciones, otra podria ser Pickle.

 Si las cadenas json/rpc son muy largas, simpre se pueden acortar en md5:

 jsonObj = { method: echo, params: [Hello JSON-RPC], id: 1}
 result = doJsonMethod(jsonObj)

 hashable = md5.new(cPickle.dumps(jsonObj)).digest()
 cache[hashable] = result

 Salud.


 El 24 de abril de 2011 12:52, Nekmo conta...@nekmo.com escribió:

 Si usas repr no te va a funcionar. Python no es igual a la sintaxis de
 Javascript (la cual es JSON). Por ejemplo, mientras que en JSON tienes
 false, true y null, en Python tienes False, True y None, lo cual te
 provocará a la hora de trabajar con el pseudo JSON bonitos errores
 del tipo False no está definida, además de que como tengas algo que
 no sea un string en la key de un diccionario, a la hora de interpretar
 el JSON también te petará (en el caso de usar el módulo JSON, te
 petará al dumpear xD).

 Un cordial saludo:
 -- Nekmo.

 Sitio web: http://nekmo.com
 Dirección de contacto: conta...@nekmo.com
 XMPP/Jabber: conta...@nekmo.com
 Identi.ca: http://identi.ca/nekmo
 Diaspora: Nekmo



 El día 23 de abril de 2011 14:24, tny a.por...@gmail.com escribió:
  El lun, 18-04-2011 a las 18:24 +0200, Pepe Aracil escribió:
  Hola Lista.
 
  Tengo que cachear objetos JSON, es decir puedo encontrarme con listas y
  diccionarios
  que son mutables y por tanto al no  ser hashables no pueden formar
  parte
  de las keys
  de un diccionario.
 
  Una idea es pasar todos los objetos mutables (diccionarios y listas) a
  inmutables (tuplas)
  mediante una función recursiva.
 
  Ejemplo:
  {method:foo, params:[sota,caballo]}   --  ((method,foo),
  (params,(sota,caballo)))
  Este sistema se me antoja algo Gastón en cuanto a ciclos CPU
 
  El otro método consiste en usar la representación en cadena del objeto
  usando repr(objeto):
  repr({method:foo, params:[sota,caballo]}) -
  '{method:foo,
  params:[sota,caballo]}'
 
 
  ¿Alguna idea más al respecto?
 
  Gracias.
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
  Voto por repr
 
  Y mucho mejor si deribas la clase de los objetos JSON y le añades el
  metodo hash, de modo que te cree el hash de la representación del json
 
 
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/


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


___
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] Convertir de mutable a inmutable

2011-04-24 Por tema lasizoillo
El día 24 de abril de 2011 13:43, Pepe Aracil p...@diselpro.com escribió:
 Hola Nekmo.

 Creo que me he explicado mal, la idea de usar repr() no es para parsear JSON
 que para eso ya existe el módulo json.
 Mi intención es cachear peticiones JSON/RPC  que se traducen en diccionarios
 python en el lado del server. Para lo cual necesito que estos diccionarios
 puedan formar parte de las keys de un diccionario que contiene los
 resultados cacheados. Para tal fin hay que transformar estos diccionarios en
 objetos inmutables y repr() es una de las opciones, otra podria ser Pickle.

 Si las cadenas json/rpc son muy largas, simpre se pueden acortar en md5:

 jsonObj = { method: echo, params: [Hello JSON-RPC], id: 1}
 result = doJsonMethod(jsonObj)

 hashable = md5.new(cPickle.dumps(jsonObj)).digest()
 cache[hashable] = result


Entiendo que echo es una función pura (el retorno de la función solo
depende de los parámetros de entrada). Si cacheas el resultado de la
función echo con el nombre de la función y los parametros de entrada
estarás haciendo algo. Si metes además en la clave de caché el id de
llamada, que tenderá a ser un identificador que no se repita, el
número de caché hits tenderá a cero.

Mira a ver si la memoization de las funciones expuestas a través de
json-rpc resuelven tu problema:
http://en.wikipedia.org/wiki/Memoization

Saludos:

Javi
___
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] Convertir de mutable a inmutable

2011-04-24 Por tema Pepe Aracil
El 24 de abril de 2011 16:12, Nekmo conta...@nekmo.com escribió:

 Vale, entonces, por lo que entiendo, la idea es comparar si un
 diccionario es igual a otro, ¿verdad? En tal caso, habría que tener en
 cuenta que el orden de los valores puede cambiar, lo cual es un
 problema... :|


Hola Nekmo.

Esta es otra de las razones por la que traduzco las cadenas JSON a objetos
python y posteriormente los vuelvo a serializar:

 import json
 repr(json.loads('{sota:10, caballo:11}'))
{u'caballo': 11, u'sota': 10}
 repr(json.loads('{caballo:11, sota:10}'))
{u'caballo': 11, u'sota': 10}


Salud.



 Un cordial saludo:
 -- Nekmo.

 Sitio web: http://nekmo.com
 Dirección de contacto: conta...@nekmo.com
 XMPP/Jabber: conta...@nekmo.com
 Identi.ca: http://identi.ca/nekmo
 Diaspora: Nekmo



 El día 24 de abril de 2011 13:43, Pepe Aracil p...@diselpro.com
 escribió:
  Hola Nekmo.
 
  Creo que me he explicado mal, la idea de usar repr() no es para parsear
 JSON
  que para eso ya existe el módulo json.
  Mi intención es cachear peticiones JSON/RPC  que se traducen en
 diccionarios
  python en el lado del server. Para lo cual necesito que estos
 diccionarios
  puedan formar parte de las keys de un diccionario que contiene los
  resultados cacheados. Para tal fin hay que transformar estos diccionarios
 en
  objetos inmutables y repr() es una de las opciones, otra podria ser
 Pickle.
 
  Si las cadenas json/rpc son muy largas, simpre se pueden acortar en md5:
 
  jsonObj = { method: echo, params: [Hello JSON-RPC], id: 1}
  result = doJsonMethod(jsonObj)
 
  hashable = md5.new(cPickle.dumps(jsonObj)).digest()
  cache[hashable] = result
 
  Salud.
 
 
  El 24 de abril de 2011 12:52, Nekmo conta...@nekmo.com escribió:
 
  Si usas repr no te va a funcionar. Python no es igual a la sintaxis de
  Javascript (la cual es JSON). Por ejemplo, mientras que en JSON tienes
  false, true y null, en Python tienes False, True y None, lo cual te
  provocará a la hora de trabajar con el pseudo JSON bonitos errores
  del tipo False no está definida, además de que como tengas algo que
  no sea un string en la key de un diccionario, a la hora de interpretar
  el JSON también te petará (en el caso de usar el módulo JSON, te
  petará al dumpear xD).
 
  Un cordial saludo:
  -- Nekmo.
 
  Sitio web: http://nekmo.com
  Dirección de contacto: conta...@nekmo.com
  XMPP/Jabber: conta...@nekmo.com
  Identi.ca: http://identi.ca/nekmo
  Diaspora: Nekmo
 
 
 
  El día 23 de abril de 2011 14:24, tny a.por...@gmail.com escribió:
   El lun, 18-04-2011 a las 18:24 +0200, Pepe Aracil escribió:
   Hola Lista.
  
   Tengo que cachear objetos JSON, es decir puedo encontrarme con listas
 y
   diccionarios
   que son mutables y por tanto al no  ser hashables no pueden formar
   parte
   de las keys
   de un diccionario.
  
   Una idea es pasar todos los objetos mutables (diccionarios y listas)
 a
   inmutables (tuplas)
   mediante una función recursiva.
  
   Ejemplo:
   {method:foo, params:[sota,caballo]}   --
  ((method,foo),
   (params,(sota,caballo)))
   Este sistema se me antoja algo Gastón en cuanto a ciclos CPU
  
   El otro método consiste en usar la representación en cadena del
 objeto
   usando repr(objeto):
   repr({method:foo, params:[sota,caballo]}) -
   '{method:foo,
   params:[sota,caballo]}'
  
  
   ¿Alguna idea más al respecto?
  
   Gracias.
   ___
   Python-es mailing list
   Python-es@python.org
   http://mail.python.org/mailman/listinfo/python-es
   FAQ: http://python-es-faq.wikidot.com/
  
   Voto por repr
  
   Y mucho mejor si deribas la clase de los objetos JSON y le añades el
   metodo hash, de modo que te cree el hash de la representación del json
  
  
   ___
   Python-es mailing list
   Python-es@python.org
   http://mail.python.org/mailman/listinfo/python-es
   FAQ: http://python-es-faq.wikidot.com/
  
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
 
  ___
  Python-es mailing list
  Python-es@python.org
  http://mail.python.org/mailman/listinfo/python-es
  FAQ: http://python-es-faq.wikidot.com/
 
 
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/

___
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] Convertir de mutable a inmutable

2011-04-23 Por tema tny
El lun, 18-04-2011 a las 18:24 +0200, Pepe Aracil escribió:
 Hola Lista.
 
 Tengo que cachear objetos JSON, es decir puedo encontrarme con listas y
 diccionarios
 que son mutables y por tanto al no  ser hashables no pueden formar parte
 de las keys
 de un diccionario.
 
 Una idea es pasar todos los objetos mutables (diccionarios y listas) a
 inmutables (tuplas)
 mediante una función recursiva.
 
 Ejemplo:
 {method:foo, params:[sota,caballo]}   --  ((method,foo),
 (params,(sota,caballo)))
 Este sistema se me antoja algo Gastón en cuanto a ciclos CPU
 
 El otro método consiste en usar la representación en cadena del objeto
 usando repr(objeto):
 repr({method:foo, params:[sota,caballo]}) - '{method:foo,
 params:[sota,caballo]}'
 
 
 ¿Alguna idea más al respecto?
 
 Gracias.
 ___
 Python-es mailing list
 Python-es@python.org
 http://mail.python.org/mailman/listinfo/python-es
 FAQ: http://python-es-faq.wikidot.com/

Voto por repr

Y mucho mejor si deribas la clase de los objetos JSON y le añades el
metodo hash, de modo que te cree el hash de la representación del json


___
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] Convertir de mutable a inmutable

2011-04-18 Por tema Javier Collado
Hola,

El día 18 de abril de 2011 18:24, Pepe Aracil p...@diselpro.com escribió:
 ¿Alguna idea más al respecto?

Una solución podría ser construir una clase diccionario que implemente
el método __hash__:
http://code.activestate.com/recipes/414283-frozen-dictionaries/
http://stackoverflow.com/questions/2703599/what-would-be-a-frozen-dict

Un saludo,
Javier
___
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] Convertir de mutable a inmutable

2011-04-18 Por tema Nekmo
en JSON las claves de los diccionarios solo pueden ser strings, y al
ser los strings objetos inmutables, no tendrás el problema del que
hablas.

Por cierto, usa el módulo json, eval es completamente inseguro y nada
recomendable.

Un cordial saludo:
-- Nekmo.

Sitio web: http://nekmo.com
Dirección de contacto: conta...@nekmo.com
XMPP/Jabber: conta...@nekmo.com
Identi.ca: http://identi.ca/nekmo
Diaspora: Nekmo



El día 18 de abril de 2011 18:24, Pepe Aracil p...@diselpro.com escribió:
 Hola Lista.

 Tengo que cachear objetos JSON, es decir puedo encontrarme con listas y
 diccionarios
 que son mutables y por tanto al no  ser hashables no pueden formar parte
 de las keys
 de un diccionario.

 Una idea es pasar todos los objetos mutables (diccionarios y listas) a
 inmutables (tuplas)
 mediante una función recursiva.

 Ejemplo:
 {method:foo, params:[sota,caballo]}   --  ((method,foo),
 (params,(sota,caballo)))
 Este sistema se me antoja algo Gastón en cuanto a ciclos CPU

 El otro método consiste en usar la representación en cadena del objeto
 usando repr(objeto):
 repr({method:foo, params:[sota,caballo]}) - '{method:foo,
 params:[sota,caballo]}'


 ¿Alguna idea más al respecto?

 Gracias.





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


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