Re: [Python-es] Convertir de mutable a inmutable
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
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
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
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
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
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
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
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/