From pachi en rvburke.com Wed Oct 2 13:31:04 2013 From: pachi en rvburke.com (Pachi) Date: Wed, 02 Oct 2013 13:31:04 +0200 Subject: [Python-es] OT: Python en la Guadec.es - Madrid - 18, 19 y 20 de octubre de 2013 en Medialab-Prado Message-ID: <524C03F8.4070203@rvburke.com> Aunque algo OT, creo que esta información es interesante para los Pythoneros que estén por Madrid en octubre. Este mes se celebra en Madrid la 10ª edición de la GUADEC hispana, un encuentro de usuarios y desarrolladores de GNOME. Tendrá lugar en El Medialab-Prado los días 18, 19 y 20 de octubre de 2013. En la web http://2013.guadec.es/ se puede consultar toda la información del encuentro (registro, lugar, fechas...). El programa detallado se irá publicando en cuanto estén confirmadas las ponencias, mesas redondas y talleres. Es un encuentro es gratuito pero para organizarnos mejor (sillas, mesas, espacios...) se pide registro, que se limita a un mail de confirmación. Además de conocer a gente interesada en GNOME y poder asistir a charlas y talleres relacionados con el desarrollo de aplicaciones y novedades en el entorno GNOME, este año también hay actividades específicas para el desarrollo con Python, que es un lenguaje importante para GNOME: - el sábado 19 habrá una charla de introducción al desarrollo de aplicaciones usando PyGObject Introspection (la tecnología que sustituye a PyGTK en GTK+ 3). - el domingo 20, está previsto un taller de desarrollo de aplicaciones con PyGObject Introspection. La actividad depende que suficiente gente quiera participar en él así que, si te interesa, mándame un mail para poder organizarlo. Os animo a participar y a inscribiros en la página del encuentro. Allí estaremos unos cuantos pythonistas usuarios y desarrolladores de GNOME, así que ¡avisad si os pasáis por la guadec.es! Saludos, Rafael Villar From yamila.ms en gmail.com Wed Oct 2 15:11:58 2013 From: yamila.ms en gmail.com (=?ISO-8859-1?Q?Yamila_Moreno_Su=E1rez?=) Date: Wed, 2 Oct 2013 15:11:58 +0200 Subject: [Python-es] [Py-MAD] OT: Python en la Guadec.es - Madrid - 18, 19 y 20 de octubre de 2013 en Medialab-Prado In-Reply-To: <524C03F8.4070203@rvburke.com> References: <524C03F8.4070203@rvburke.com> Message-ID: Yo ya le comenté a Ana Rey que me pasaría, aunque no soy nada gnomera (espero que no me matéis XD) ¡un saludote! yami 2013/10/2 Pachi > Aunque algo OT, creo que esta información es interesante para los > Pythoneros que estén por Madrid en octubre. > > Este mes se celebra en Madrid la 10ª edición de la GUADEC hispana, un > encuentro de usuarios y desarrolladores de GNOME. Tendrá lugar en El > Medialab-Prado los días 18, 19 y 20 de octubre de 2013. > > En la web http://2013.guadec.es/ se puede consultar toda la información > del encuentro (registro, lugar, fechas...). El programa detallado se irá > publicando en cuanto estén confirmadas las ponencias, mesas redondas y > talleres. > > Es un encuentro es gratuito pero para organizarnos mejor (sillas, mesas, > espacios...) se pide registro, que se limita a un mail de confirmación. > > Además de conocer a gente interesada en GNOME y poder asistir a charlas y > talleres relacionados con el desarrollo de aplicaciones y novedades en el > entorno GNOME, este año también hay actividades específicas para el > desarrollo con Python, que es un lenguaje importante para GNOME: > > - el sábado 19 habrá una charla de introducción al desarrollo de > aplicaciones usando PyGObject Introspection (la tecnología que sustituye a > PyGTK en GTK+ 3). > - el domingo 20, está previsto un taller de desarrollo de aplicaciones > con PyGObject Introspection. La actividad depende que suficiente gente > quiera participar en él así que, si te interesa, mándame un mail para poder > organizarlo. > > Os animo a participar y a inscribiros en la página del encuentro. > > Allí estaremos unos cuantos pythonistas usuarios y desarrolladores de > GNOME, así que ¡avisad si os pasáis por la guadec.es! > > Saludos, > > Rafael Villar > ______________________________**_________________ > Madrid mailing list > Madrid en lists.es.python.org > https://lists.es.python.org/**listinfo/madrid -- Yamila Moreno Suárez http://dendarii.wordpress.com http://moduslaborandi.net ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pachi en rvburke.com Wed Oct 2 18:28:37 2013 From: pachi en rvburke.com (Pachi) Date: Wed, 02 Oct 2013 18:28:37 +0200 Subject: [Python-es] [Py-MAD] OT: Python en la Guadec.es - Madrid - 18, 19 y 20 de octubre de 2013 en Medialab-Prado In-Reply-To: References: <524C03F8.4070203@rvburke.com> Message-ID: <524C49B5.4010707@rvburke.com> Jeje, todo el mundo es bienvenido, aunque no use GNOME todos los días. La parte social es también importante y además muy divertida. ¡Saludos! Rafael El 02/10/2013 15:11, Yamila Moreno Suárez escribió: > Yo ya le comenté a Ana Rey que me pasaría, aunque no soy nada gnomera > (espero que no me matéis XD) > > ¡un saludote! > yami > > > 2013/10/2 Pachi > > > Aunque algo OT, creo que esta información es interesante para los > Pythoneros que estén por Madrid en octubre. > > Este mes se celebra en Madrid la 10ª edición de la GUADEC hispana, > un encuentro de usuarios y desarrolladores de GNOME. Tendrá lugar > en El Medialab-Prado los días 18, 19 y 20 de octubre de 2013. > > En la web http://2013.guadec.es/ se puede consultar toda la > información del encuentro (registro, lugar, fechas...). El > programa detallado se irá publicando en cuanto estén confirmadas > las ponencias, mesas redondas y talleres. > > Es un encuentro es gratuito pero para organizarnos mejor (sillas, > mesas, espacios...) se pide registro, que se limita a un mail de > confirmación. > > Además de conocer a gente interesada en GNOME y poder asistir a > charlas y talleres relacionados con el desarrollo de aplicaciones > y novedades en el entorno GNOME, este año también hay actividades > específicas para el desarrollo con Python, que es un lenguaje > importante para GNOME: > > - el sábado 19 habrá una charla de introducción al desarrollo de > aplicaciones usando PyGObject Introspection (la tecnología que > sustituye a PyGTK en GTK+ 3). > - el domingo 20, está previsto un taller de desarrollo de > aplicaciones con PyGObject Introspection. La actividad depende que > suficiente gente quiera participar en él así que, si te interesa, > mándame un mail para poder organizarlo. > > Os animo a participar y a inscribiros en la página del encuentro. > > Allí estaremos unos cuantos pythonistas usuarios y desarrolladores > de GNOME, así que ¡avisad si os pasáis por la guadec.es > ! > > Saludos, > > Rafael Villar > _______________________________________________ > Madrid mailing list > Madrid en lists.es.python.org > https://lists.es.python.org/listinfo/madrid > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From egirun en yahoo.com Thu Oct 3 20:28:37 2013 From: egirun en yahoo.com (Eliezer Gallegos) Date: Thu, 3 Oct 2013 11:28:37 -0700 (PDT) Subject: [Python-es] OT- Necesito un colaborador Message-ID: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> Hola Gente: perdon por el OT... Estoy en la busqueda de alguien que me pueda colaborar para terminar una Aplicacion de Gestion ya hecha en... Python+wxPython+MySql+Boa-Constructor y correrá en Windows de todo tipo.... la Aplicacion ya está casi en su totalidad...... Que necesito...? alguien con experiencia en éste tipo de Aplicaciones (Compras/Facturacion/Inv.)..etc Porque....? porque necesito agregar cosas puntuales como: valorizar el Inventario a Costo Promedio... agregar que pueda manejar varias sucursales...y varios almacenes. hacer traspasos de productos/articulos entre almacenes... hacer un modulo para la toma de Inventario Fisico... necesito agregar la Facturacion Electronica..... (ésto si no se puede no hay problema) y una gran lista de cosas, que necesito para entrar a Produccion lo mas pronto posible... estoy en Mexico....... si alguien se interesa estoy a su disposicion, para platicarlo mas ampliamente por medio de mi correo...egirun.yahoo.com Reciban Saludos Eliezer Gallegos ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From todosobrepython en gmail.com Fri Oct 4 20:08:12 2013 From: todosobrepython en gmail.com (Jorge Vega Trigueros) Date: Fri, 4 Oct 2013 12:08:12 -0600 Subject: [Python-es] OT- Necesito un colaborador In-Reply-To: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> References: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> Message-ID: Saludos Eliecer: Mi nombre es Jorge Vega, tengo bastante experiencia en sistemas de ese tipo, es mas tengo software en Velneo, pero me he dedicado ha investigar Python con esas caracteristicas que mencionas, pero no estoy al 100 %, pero si no te urge, me interesaría colaborar con vos. Así cuando vengan a jugar podemos hablar... jajjaja Soy de Costa Rica. Mi correo es jvegat en gmail.com. Mi curva de El 3 de octubre de 2013 12:28, Eliezer Gallegos escribió: > Hola Gente: > perdon por el OT... > Estoy en la busqueda de alguien que me pueda colaborar para terminar una > Aplicacion de Gestion ya hecha en... Python+wxPython+MySql+Boa-Constructor > y correrá en Windows de todo tipo.... > la Aplicacion ya está casi en su totalidad...... > Que necesito...? > alguien con experiencia en éste tipo de Aplicaciones > (Compras/Facturacion/Inv.)..etc > Porque....? > porque necesito agregar cosas puntuales como: > valorizar el Inventario a Costo Promedio... > agregar que pueda manejar varias sucursales...y varios almacenes. > hacer traspasos de productos/articulos entre almacenes... > hacer un modulo para la toma de Inventario Fisico... > necesito agregar la Facturacion Electronica..... (ésto si no se puede no > hay problema) > y una gran lista de cosas, que necesito para entrar a Produccion lo mas > pronto posible... > estoy en Mexico....... > si alguien se interesa estoy a su disposicion, para platicarlo > mas ampliamente por medio de mi correo...egirun.yahoo.com > > Reciban Saludos > Eliezer Gallegos > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From olemis en gmail.com Tue Oct 8 02:45:31 2013 From: olemis en gmail.com (Olemis Lang) Date: Mon, 7 Oct 2013 19:45:31 -0500 Subject: [Python-es] Enumerar clusters de PostgreSQL Message-ID: Hola a todos ! Estoy buscando alguna librería q permita enumerar los clusters d PostgreSQL disponibles en un host (i.e. pg_lsclusters , pero sin tener q utilizar subprocess ni parsear la tabla d clusters) . Lo más parecido q he encontrado es py-postgresql [1]_ [2]_ [3]_ q ofrece Clusters , pero no he encontrado la manera d enumerarlos ¿Alguien conoce alguna librería q permita hacer esto? TIA .. [1] http://python.projects.pgfoundry.org/ .. [2] http://pythonhosted.org/py-postgresql/cluster.html .. [3] https://pypi.python.org/pypi/py-postgresql -- Regards, Olemis - @olemislc Apache? Bloodhound contributor http://issues.apache.org/bloodhound http://blood-hound.net Blog ES: http://simelo-es.blogspot.com/ Blog EN: http://simelo-en.blogspot.com/ Featured article: Popularidad de Python, septiembre 2013 - http://goo.gl/fb/tr0XB From glez_b en comunidad.unam.mx Tue Oct 8 07:42:56 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Tue, 8 Oct 2013 05:42:56 +0000 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= Message-ID: Tengo datos mensuales estructurados en la siguiente manera Fecha,Time, Humedad, Temperatura, Precipitación Acumulada 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, . . . . 1/01/2011, 23:45, 22, 40, 0, . . . . 31/01/2011, 00:00, 23, 45, 0, Como puedo conseguir los promedios díarios de las variables Temperatura y Humedad así como la suma díaria de la Precipitacion Acumulada? ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From a.chamorro.ruiz en gmail.com Tue Oct 8 08:06:38 2013 From: a.chamorro.ruiz en gmail.com (Alberto Chamorro) Date: Tue, 8 Oct 2013 08:06:38 +0200 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: References: Message-ID: Y la pregunta sobre Python es.... ¿Tienes algún algoritmo que hayas intentado hacer al menos? Alberto Tengo datos mensuales estructurados en la siguiente manera Fecha,Time, Humedad, Temperatura, Precipitación Acumulada 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, . . . .1/01/2011, 23:45, 22, 40, 0, . . . .31/01/2011, 00:00, 23, 45, 0, Como puedo conseguir los promedios díarios de las variables Temperatura y Humedad así como la suma díaria de la Precipitacion Acumulada? _______________________________________________ Python-es mailing list Python-es en python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kikocorreoso en gmail.com Tue Oct 8 08:08:58 2013 From: kikocorreoso en gmail.com (Kiko) Date: Tue, 8 Oct 2013 08:08:58 +0200 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: References: Message-ID: ¿Tienes posibilidad de usar numpy y/o pandas? Si es así, instálalos, inténta hacer lo que quieres y si no lo consigues pon por aquí el código que has usado para intentarlo y te guiamos sobre ese código. Si no puedes instalar ninguna librería tu problema se puede resolver de forma sencilla con unos bucles. Repito lo mismo del párrafo anterior, pon por aquí el código que has usado para intentarlo y te guiamos sobre ese código. Saludos. El 8 de octubre de 2013 07:42, Boris Vladimir Comi escribió: > Tengo datos mensuales estructurados en la siguiente manera > > Fecha,Time, Humedad, Temperatura, Precipitación Acumulada > 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, > . > . > . > .1/01/2011, 23:45, 22, 40, 0, > . > . > . > .31/01/2011, 00:00, 23, 45, 0, > > Como puedo conseguir los promedios díarios de las variables Temperatura y > Humedad así como la suma díaria de la Precipitacion Acumulada? > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From glez_b en comunidad.unam.mx Tue Oct 8 09:46:18 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Tue, 8 Oct 2013 07:46:18 +0000 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: References: , , Message-ID: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> Me falto aclarar que los promedios que obtengo con el codigo, usando numpy, son los promedios de todos los datos y yo estoy interesado en obtener los promedios díarios, como se puede lograr eso? ________________________________ De: Boris Vladimir Comi Enviado: martes, 08 de octubre de 2013 02:43 a.m. Para: La lista de python en castellano Asunto: RE: [Python-es] Promedios díarios en python Gracias Alberto y Kiko: Si tengo instaladas las librerias de numpy y pandas. Al obtener los promedios, maximo y minimo de una base de datos de prueba cuya estructura es como sigue: Fecha, lat, lon, id, humedad,temperatura,precipitacion Para leer los datos y obtener los estadísticos lo hago de dos maneras: usando numpy: from numpy import * from scipy import * import numpy as np data=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=str) data1=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=int,usecols=[4,5]) print data [['2/5/04 6:45 AM' '19.7' '-95.2' '1' '45' '-38' '1'] ['2/5/04 7:45 AM' '19.7' '-94.7' '1' '34' '-48' '1'] ['2/5/04 8:45 AM' '19.3' '-93.9' '1' '57' '-60' '1'] ['2/5/04 9:45 AM' '19' '-93.5' '1' '89' '-58' '1'] ['2/5/04 10:45 AM' '19' '-92.8' '1' '34' '-50' '2'] ['2/5/04 11:45 AM' '19.2' '-92.6' '1' '23' '-40' '3'] ['2/5/04 12:45 PM' '19.9' '-93' '1' '10' '-43' '4'] ['2/5/04 1:15 PM' '20' '-92.8' '1' '50' '-32' '2'] ['30/5/04 4:45 AM' '23.1' '-100.2' '2' '45' '-45' '3'] ['30/5/04 5:45 AM' '23.2' '-100' '2' '68' '-56' '2'] ['30/5/04 6:45 AM' '23.3' '-100' '2' '90' '-48' '1'] ['30/5/04 7:45 AM' '23.3' '-100.2' '2' '100' '-32' '1'] ['31/5/04 3:15 AM' '23.4' '-99' '3' '12' '-36' '1'] ['31/5/04 4:15 AM' '23.5' '-98.9' '3' '34' '-46' '1'] ['31/5/04 5:15 AM' '23.6' '-98.7' '3' '56' '-68' '2'] ['31/5/04 6:15 AM' '23.7' '-98.8' '3' '78' '-30' '1']] print 'mean:', data1.mean(axis=0) print 'max:', data1.max(axis=0) print 'min:', data1.min(axis=0) mean: [ 51.5625 -45.625 ] max: [100 -30] min: [ 10 -68] la pregunta es: como obtengo la suma unicamente de la columna precipitacion? Usando pandas: import pandas as pd df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) df Lat Lon ID Moisture Temperature Precipitacion Date 2004-02-05 06:45:00 19.7 -95.2 1 45 -38 1 2004-02-05 07:45:00 19.7 -94.7 1 34 -48 1 2004-02-05 08:45:00 19.3 -93.9 1 57 -60 1 2004-02-05 09:45:00 19.0 -93.5 1 89 -58 1 2004-02-05 10:45:00 19.0 -92.8 1 34 -50 2 2004-02-05 11:45:00 19.2 -92.6 1 23 -40 3 2004-02-05 12:45:00 19.9 -93.0 1 10 -43 4 2004-02-05 13:15:00 20.0 -92.8 1 50 -32 2 2004-05-30 04:45:00 23.1 -100.2 2 45 -45 3 2004-05-30 05:45:00 23.2 -100.0 2 68 -56 2 2004-05-30 06:45:00 23.3 -100.0 2 90 -48 1 2004-05-30 07:45:00 23.3 -100.2 2 100 -32 1 2004-05-31 03:15:00 23.4 -99.0 3 12 -36 1 2004-05-31 04:15:00 23.5 -98.9 3 34 -46 1 2004-05-31 05:15:00 23.6 -98.7 3 56 -68 2 2004-05-31 06:15:00 23.7 -98.8 3 78 -30 1 Al intentar conseguir, por ejmplo la suma diaria: df.resample('D',how='sum') obtengo lo siguiente: Lat Lon ID Moisture Temperature Date 2004-02-06 155.8 -748.5 8 342 -369 2004-02-07 NaN NaN NaN NaN NaN 2004-02-08 NaN NaN NaN NaN NaN 2004-02-09 NaN NaN NaN NaN NaN 2004-02-10 NaN NaN NaN NaN NaN 2004-02-11 NaN NaN NaN NaN NaN 2004-02-12 NaN NaN NaN NaN NaN 2004-02-13 NaN NaN NaN NaN NaN 2004-02-14 NaN NaN NaN NaN NaN 2004-02-15 NaN NaN NaN NaN NaN 2004-02-16 NaN NaN NaN NaN NaN 2004-02-17 NaN NaN NaN NaN NaN 2004-02-18 NaN NaN NaN NaN NaN 2004-02-19 NaN NaN NaN NaN NaN 2004-02-20 NaN NaN NaN NaN NaN 2004-02-21 NaN NaN NaN NaN NaN 2004-02-22 NaN NaN NaN NaN NaN 2004-02-23 NaN NaN NaN NaN NaN 2004-02-24 NaN NaN NaN NaN NaN 2004-02-25 NaN NaN NaN NaN NaN 2004-02-26 NaN NaN NaN NaN NaN 2004-02-27 NaN NaN NaN NaN NaN 2004-02-28 NaN NaN NaN NaN NaN 2004-02-29 NaN NaN NaN NaN NaN 2004-03-01 NaN NaN NaN NaN NaN 2004-03-02 NaN NaN NaN NaN NaN 2004-03-03 NaN NaN NaN NaN NaN 2004-03-04 NaN NaN NaN NaN NaN 2004-03-05 NaN NaN NaN NaN NaN 2004-03-06 NaN NaN NaN NaN NaN 2004-03-07 NaN NaN NaN NaN NaN 2004-03-08 NaN NaN NaN NaN NaN 2004-03-09 NaN NaN NaN NaN NaN 2004-03-10 NaN NaN NaN NaN NaN 2004-03-11 NaN NaN NaN NaN NaN 2004-03-12 NaN NaN NaN NaN NaN 2004-03-13 NaN NaN NaN NaN NaN 2004-03-14 NaN NaN NaN NaN NaN 2004-03-15 NaN NaN NaN NaN NaN 2004-03-16 NaN NaN NaN NaN NaN 2004-03-17 NaN NaN NaN NaN NaN 2004-03-18 NaN NaN NaN NaN NaN 2004-03-19 NaN NaN NaN NaN NaN 2004-03-20 NaN NaN NaN NaN NaN 2004-03-21 NaN NaN NaN NaN NaN 2004-03-22 NaN NaN NaN NaN NaN 2004-03-23 NaN NaN NaN NaN NaN 2004-03-24 NaN NaN NaN NaN NaN 2004-03-25 NaN NaN NaN NaN NaN 2004-03-26 NaN NaN NaN NaN NaN 2004-03-27 NaN NaN NaN NaN NaN 2004-03-28 NaN NaN NaN NaN NaN 2004-03-29 NaN NaN NaN NaN NaN 2004-03-30 NaN NaN NaN NaN NaN 2004-03-31 NaN NaN NaN NaN NaN 2004-04-01 NaN NaN NaN NaN NaN 2004-04-02 NaN NaN NaN NaN NaN 2004-04-03 NaN NaN NaN NaN NaN 2004-04-04 NaN NaN NaN NaN NaN 2004-04-05 NaN NaN NaN NaN NaN 2004-04-06 NaN NaN NaN NaN NaN 2004-04-07 NaN NaN NaN NaN NaN 2004-04-08 NaN NaN NaN NaN NaN 2004-04-09 NaN NaN NaN NaN NaN 2004-04-10 NaN NaN NaN NaN NaN 2004-04-11 NaN NaN NaN NaN NaN 2004-04-12 NaN NaN NaN NaN NaN 2004-04-13 NaN NaN NaN NaN NaN 2004-04-14 NaN NaN NaN NaN NaN 2004-04-15 NaN NaN NaN NaN NaN 2004-04-16 NaN NaN NaN NaN NaN 2004-04-17 NaN NaN NaN NaN NaN 2004-04-18 NaN NaN NaN NaN NaN 2004-04-19 NaN NaN NaN NaN NaN 2004-04-20 NaN NaN NaN NaN NaN 2004-04-21 NaN NaN NaN NaN NaN 2004-04-22 NaN NaN NaN NaN NaN 2004-04-23 NaN NaN NaN NaN NaN 2004-04-24 NaN NaN NaN NaN NaN 2004-04-25 NaN NaN NaN NaN NaN 2004-04-26 NaN NaN NaN NaN NaN 2004-04-27 NaN NaN NaN NaN NaN 2004-04-28 NaN NaN NaN NaN NaN 2004-04-29 NaN NaN NaN NaN NaN 2004-04-30 NaN NaN NaN NaN NaN 2004-05-01 NaN NaN NaN NaN NaN 2004-05-02 NaN NaN NaN NaN NaN 2004-05-03 NaN NaN NaN NaN NaN 2004-05-04 NaN NaN NaN NaN NaN 2004-05-05 NaN NaN NaN NaN NaN 2004-05-06 NaN NaN NaN NaN NaN 2004-05-07 NaN NaN NaN NaN NaN 2004-05-08 NaN NaN NaN NaN NaN 2004-05-09 NaN NaN NaN NaN NaN 2004-05-10 NaN NaN NaN NaN NaN 2004-05-11 NaN NaN NaN NaN NaN 2004-05-12 NaN NaN NaN NaN NaN 2004-05-13 NaN NaN NaN NaN NaN 2004-05-14 NaN NaN NaN NaN NaN 2004-05-15 NaN NaN NaN NaN NaN 2004-05-16 NaN NaN NaN NaN NaN 2004-05-17 NaN NaN NaN NaN NaN 2004-05-18 NaN NaN NaN NaN NaN 2004-05-19 NaN NaN NaN NaN NaN 2004-05-20 NaN NaN NaN NaN NaN 2004-05-21 NaN NaN NaN NaN NaN 2004-05-22 NaN NaN NaN NaN NaN 2004-05-23 NaN NaN NaN NaN NaN 2004-05-24 NaN NaN NaN NaN NaN 2004-05-25 NaN NaN NaN NaN NaN 2004-05-26 NaN NaN NaN NaN NaN 2004-05-27 NaN NaN NaN NaN NaN 2004-05-28 NaN NaN NaN NaN NaN 2004-05-29 NaN NaN NaN NaN NaN 2004-05-30 NaN NaN NaN NaN NaN 2004-05-31 92.9 -400.4 8 303 -181 5 2004-06-01 94.2 -395.4 12 180 -180 Hice algo mal, porque no toma en cuenta la fecha correspondiente al 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? Agradeceria su ayuda ________________________________ De: Python-es en nombre de Alberto Chamorro Enviado: martes, 08 de octubre de 2013 01:06 a.m. Para: La lista de python en castellano Asunto: Re: [Python-es] Promedios díarios en python Y la pregunta sobre Python es.... ¿Tienes algún algoritmo que hayas intentado hacer al menos? Alberto Tengo datos mensuales estructurados en la siguiente manera Fecha,Time, Humedad, Temperatura, Precipitación Acumulada 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, . . . . 1/01/2011, 23:45, 22, 40, 0, . . . . 31/01/2011, 00:00, 23, 45, 0, Como puedo conseguir los promedios díarios de las variables Temperatura y Humedad así como la suma díaria de la Precipitacion Acumulada? _______________________________________________ Python-es mailing list Python-es en python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kikocorreoso en gmail.com Tue Oct 8 10:15:04 2013 From: kikocorreoso en gmail.com (Kiko) Date: Tue, 8 Oct 2013 10:15:04 +0200 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> References: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> Message-ID: > print 'mean:', data1.mean(axis=0) > print 'max:', data1.max(axis=0) > print 'min:', data1.min(axis=0) > > mean: [ 51.5625 -45.625 ] > max: [100 -30] > min: [ 10 -68] > > la pregunta es: como obtengo la suma unicamente de la columna > precipitacion? > > Usando pandas: > > import pandas as pd > > df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) > > ... > Al intentar conseguir, por ejmplo la suma diaria: > > df.resample('D',how='sum') > > ... > Hice algo mal, porque no toma en cuenta la fecha correspondiente al > 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? > > Puedes convertir la columna de fechas a fechas que entienda pandas y usarlas como índice para procesar el promedio día a día. Para convertir las fechas le puedes echar un ojo a las siguientes funciones: pd.io.date_converters.parse_all_fields(...) pd.DatetimeIndex(...) Una vez que tienes tus índices como fechas puedes sacar medias por periodos usando el resample, En tu caso sería: df.resample('D', how='mean') Si no me equivoco (hace unos meses que no uso pandas). ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From plobarinas en jcea.es Tue Oct 8 10:15:42 2013 From: plobarinas en jcea.es (=?UTF-8?B?UGFibG8gTG9iYXJpw7Fhcw==?=) Date: Tue, 08 Oct 2013 10:15:42 +0200 Subject: [Python-es] =?utf-8?q?Convocatoria_reuni=C3=B3n_Python-Madrid_oct?= =?utf-8?q?ubre_2013?= Message-ID: <5253BF2E.5010800@jcea.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hola a todos: Como cada mes, en Python- Madrid nos reunimos para una charla y compartir luego cervezas y pinchos. En esta ocasión nos veremos en Tetuan Valley, aquí tenéis los detalles: http://www.python-madrid.es/post/reunion-octubre-2013-python-madrid/ Un saludo. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (Darwin) Comment: GPGTools - http://gpgtools.org iEYEARECAAYFAlJTvy4ACgkQnPFBatEMYOdivQCeKGOa/NrAJfA16c7VAkB3+BO3 mN0AnA9f1iXIbl3F7nWuztfp/TjiLUpN =g3vz -----END PGP SIGNATURE----- From glez_b en comunidad.unam.mx Tue Oct 8 09:43:25 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Tue, 8 Oct 2013 07:43:25 +0000 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: References: , Message-ID: Gracias Alberto y Kiko: Si tengo instaladas las librerias de numpy y pandas. Al obtener los promedios, maximo y minimo de una base de datos de prueba cuya estructura es como sigue: Fecha, lat, lon, id, humedad,temperatura,precipitacion Para leer los datos y obtener los estadísticos lo hago de dos maneras: usando numpy: from numpy import * from scipy import * import numpy as np data=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=str) data1=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=int,usecols=[4,5]) print data [['2/5/04 6:45 AM' '19.7' '-95.2' '1' '45' '-38' '1'] ['2/5/04 7:45 AM' '19.7' '-94.7' '1' '34' '-48' '1'] ['2/5/04 8:45 AM' '19.3' '-93.9' '1' '57' '-60' '1'] ['2/5/04 9:45 AM' '19' '-93.5' '1' '89' '-58' '1'] ['2/5/04 10:45 AM' '19' '-92.8' '1' '34' '-50' '2'] ['2/5/04 11:45 AM' '19.2' '-92.6' '1' '23' '-40' '3'] ['2/5/04 12:45 PM' '19.9' '-93' '1' '10' '-43' '4'] ['2/5/04 1:15 PM' '20' '-92.8' '1' '50' '-32' '2'] ['30/5/04 4:45 AM' '23.1' '-100.2' '2' '45' '-45' '3'] ['30/5/04 5:45 AM' '23.2' '-100' '2' '68' '-56' '2'] ['30/5/04 6:45 AM' '23.3' '-100' '2' '90' '-48' '1'] ['30/5/04 7:45 AM' '23.3' '-100.2' '2' '100' '-32' '1'] ['31/5/04 3:15 AM' '23.4' '-99' '3' '12' '-36' '1'] ['31/5/04 4:15 AM' '23.5' '-98.9' '3' '34' '-46' '1'] ['31/5/04 5:15 AM' '23.6' '-98.7' '3' '56' '-68' '2'] ['31/5/04 6:15 AM' '23.7' '-98.8' '3' '78' '-30' '1']] print 'mean:', data1.mean(axis=0) print 'max:', data1.max(axis=0) print 'min:', data1.min(axis=0) mean: [ 51.5625 -45.625 ] max: [100 -30] min: [ 10 -68] la pregunta es: como obtengo la suma unicamente de la columna precipitacion? Usando pandas: import pandas as pd df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) df Lat Lon ID Moisture Temperature Precipitacion Date 2004-02-05 06:45:00 19.7 -95.2 1 45 -38 1 2004-02-05 07:45:00 19.7 -94.7 1 34 -48 1 2004-02-05 08:45:00 19.3 -93.9 1 57 -60 1 2004-02-05 09:45:00 19.0 -93.5 1 89 -58 1 2004-02-05 10:45:00 19.0 -92.8 1 34 -50 2 2004-02-05 11:45:00 19.2 -92.6 1 23 -40 3 2004-02-05 12:45:00 19.9 -93.0 1 10 -43 4 2004-02-05 13:15:00 20.0 -92.8 1 50 -32 2 2004-05-30 04:45:00 23.1 -100.2 2 45 -45 3 2004-05-30 05:45:00 23.2 -100.0 2 68 -56 2 2004-05-30 06:45:00 23.3 -100.0 2 90 -48 1 2004-05-30 07:45:00 23.3 -100.2 2 100 -32 1 2004-05-31 03:15:00 23.4 -99.0 3 12 -36 1 2004-05-31 04:15:00 23.5 -98.9 3 34 -46 1 2004-05-31 05:15:00 23.6 -98.7 3 56 -68 2 2004-05-31 06:15:00 23.7 -98.8 3 78 -30 1 Al intentar conseguir, por ejmplo la suma diaria: df.resample('D',how='sum') obtengo lo siguiente: Lat Lon ID Moisture Temperature Date 2004-02-06 155.8 -748.5 8 342 -369 2004-02-07 NaN NaN NaN NaN NaN 2004-02-08 NaN NaN NaN NaN NaN 2004-02-09 NaN NaN NaN NaN NaN 2004-02-10 NaN NaN NaN NaN NaN 2004-02-11 NaN NaN NaN NaN NaN 2004-02-12 NaN NaN NaN NaN NaN 2004-02-13 NaN NaN NaN NaN NaN 2004-02-14 NaN NaN NaN NaN NaN 2004-02-15 NaN NaN NaN NaN NaN 2004-02-16 NaN NaN NaN NaN NaN 2004-02-17 NaN NaN NaN NaN NaN 2004-02-18 NaN NaN NaN NaN NaN 2004-02-19 NaN NaN NaN NaN NaN 2004-02-20 NaN NaN NaN NaN NaN 2004-02-21 NaN NaN NaN NaN NaN 2004-02-22 NaN NaN NaN NaN NaN 2004-02-23 NaN NaN NaN NaN NaN 2004-02-24 NaN NaN NaN NaN NaN 2004-02-25 NaN NaN NaN NaN NaN 2004-02-26 NaN NaN NaN NaN NaN 2004-02-27 NaN NaN NaN NaN NaN 2004-02-28 NaN NaN NaN NaN NaN 2004-02-29 NaN NaN NaN NaN NaN 2004-03-01 NaN NaN NaN NaN NaN 2004-03-02 NaN NaN NaN NaN NaN 2004-03-03 NaN NaN NaN NaN NaN 2004-03-04 NaN NaN NaN NaN NaN 2004-03-05 NaN NaN NaN NaN NaN 2004-03-06 NaN NaN NaN NaN NaN 2004-03-07 NaN NaN NaN NaN NaN 2004-03-08 NaN NaN NaN NaN NaN 2004-03-09 NaN NaN NaN NaN NaN 2004-03-10 NaN NaN NaN NaN NaN 2004-03-11 NaN NaN NaN NaN NaN 2004-03-12 NaN NaN NaN NaN NaN 2004-03-13 NaN NaN NaN NaN NaN 2004-03-14 NaN NaN NaN NaN NaN 2004-03-15 NaN NaN NaN NaN NaN 2004-03-16 NaN NaN NaN NaN NaN 2004-03-17 NaN NaN NaN NaN NaN 2004-03-18 NaN NaN NaN NaN NaN 2004-03-19 NaN NaN NaN NaN NaN 2004-03-20 NaN NaN NaN NaN NaN 2004-03-21 NaN NaN NaN NaN NaN 2004-03-22 NaN NaN NaN NaN NaN 2004-03-23 NaN NaN NaN NaN NaN 2004-03-24 NaN NaN NaN NaN NaN 2004-03-25 NaN NaN NaN NaN NaN 2004-03-26 NaN NaN NaN NaN NaN 2004-03-27 NaN NaN NaN NaN NaN 2004-03-28 NaN NaN NaN NaN NaN 2004-03-29 NaN NaN NaN NaN NaN 2004-03-30 NaN NaN NaN NaN NaN 2004-03-31 NaN NaN NaN NaN NaN 2004-04-01 NaN NaN NaN NaN NaN 2004-04-02 NaN NaN NaN NaN NaN 2004-04-03 NaN NaN NaN NaN NaN 2004-04-04 NaN NaN NaN NaN NaN 2004-04-05 NaN NaN NaN NaN NaN 2004-04-06 NaN NaN NaN NaN NaN 2004-04-07 NaN NaN NaN NaN NaN 2004-04-08 NaN NaN NaN NaN NaN 2004-04-09 NaN NaN NaN NaN NaN 2004-04-10 NaN NaN NaN NaN NaN 2004-04-11 NaN NaN NaN NaN NaN 2004-04-12 NaN NaN NaN NaN NaN 2004-04-13 NaN NaN NaN NaN NaN 2004-04-14 NaN NaN NaN NaN NaN 2004-04-15 NaN NaN NaN NaN NaN 2004-04-16 NaN NaN NaN NaN NaN 2004-04-17 NaN NaN NaN NaN NaN 2004-04-18 NaN NaN NaN NaN NaN 2004-04-19 NaN NaN NaN NaN NaN 2004-04-20 NaN NaN NaN NaN NaN 2004-04-21 NaN NaN NaN NaN NaN 2004-04-22 NaN NaN NaN NaN NaN 2004-04-23 NaN NaN NaN NaN NaN 2004-04-24 NaN NaN NaN NaN NaN 2004-04-25 NaN NaN NaN NaN NaN 2004-04-26 NaN NaN NaN NaN NaN 2004-04-27 NaN NaN NaN NaN NaN 2004-04-28 NaN NaN NaN NaN NaN 2004-04-29 NaN NaN NaN NaN NaN 2004-04-30 NaN NaN NaN NaN NaN 2004-05-01 NaN NaN NaN NaN NaN 2004-05-02 NaN NaN NaN NaN NaN 2004-05-03 NaN NaN NaN NaN NaN 2004-05-04 NaN NaN NaN NaN NaN 2004-05-05 NaN NaN NaN NaN NaN 2004-05-06 NaN NaN NaN NaN NaN 2004-05-07 NaN NaN NaN NaN NaN 2004-05-08 NaN NaN NaN NaN NaN 2004-05-09 NaN NaN NaN NaN NaN 2004-05-10 NaN NaN NaN NaN NaN 2004-05-11 NaN NaN NaN NaN NaN 2004-05-12 NaN NaN NaN NaN NaN 2004-05-13 NaN NaN NaN NaN NaN 2004-05-14 NaN NaN NaN NaN NaN 2004-05-15 NaN NaN NaN NaN NaN 2004-05-16 NaN NaN NaN NaN NaN 2004-05-17 NaN NaN NaN NaN NaN 2004-05-18 NaN NaN NaN NaN NaN 2004-05-19 NaN NaN NaN NaN NaN 2004-05-20 NaN NaN NaN NaN NaN 2004-05-21 NaN NaN NaN NaN NaN 2004-05-22 NaN NaN NaN NaN NaN 2004-05-23 NaN NaN NaN NaN NaN 2004-05-24 NaN NaN NaN NaN NaN 2004-05-25 NaN NaN NaN NaN NaN 2004-05-26 NaN NaN NaN NaN NaN 2004-05-27 NaN NaN NaN NaN NaN 2004-05-28 NaN NaN NaN NaN NaN 2004-05-29 NaN NaN NaN NaN NaN 2004-05-30 NaN NaN NaN NaN NaN 2004-05-31 92.9 -400.4 8 303 -181 5 2004-06-01 94.2 -395.4 12 180 -180 Hice algo mal, porque no toma en cuenta la fecha correspondiente al 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? Agradeceria su ayuda ________________________________ De: Python-es en nombre de Alberto Chamorro Enviado: martes, 08 de octubre de 2013 01:06 a.m. Para: La lista de python en castellano Asunto: Re: [Python-es] Promedios díarios en python Y la pregunta sobre Python es.... ¿Tienes algún algoritmo que hayas intentado hacer al menos? Alberto Tengo datos mensuales estructurados en la siguiente manera Fecha,Time, Humedad, Temperatura, Precipitación Acumulada 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, . . . . 1/01/2011, 23:45, 22, 40, 0, . . . . 31/01/2011, 00:00, 23, 45, 0, Como puedo conseguir los promedios díarios de las variables Temperatura y Humedad así como la suma díaria de la Precipitacion Acumulada? _______________________________________________ Python-es mailing list Python-es en python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rggg88 en hotmail.com Tue Oct 8 12:18:11 2013 From: rggg88 en hotmail.com (Rafael Gomes) Date: Tue, 8 Oct 2013 11:18:11 +0100 Subject: [Python-es] Duda con ejecutar funciones en un HTTP POST Message-ID: Buenos Dias, Como están? Espero que bien :). Disculpen molestar, pero es que tengo una duda conceptual a desarrollar un metodo HTTP POST en un servidor REST utilizando la herramienta bootle del Python. El metodo HTTP POST sirve para el envio de información por parte del cliente al servidor para crear un determinado recurso correcto? Por tal motivo luego es devolvido el número de identificacion del recurso creado o consequentemente el mensaje que no pudimos crear el recurso correcto? Mi duda es la siguiente: yo quiero en este método devolver el número de identificación para el cliente y después de esto ejecutar otra función que va realizar otra petición POST para otro servidor para efectuar la activación de otros recursos. Todo esto dentro del primero pedido del cliente. Para este problema pensé utilizar threads o utilizar una mySQL a fin de simplificar el problema. Pero no se si estoy pensando bien. Si me pudiesen ayudar agradecia :). Continuación de un buen dia. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From juanlu001 en gmail.com Tue Oct 8 12:19:05 2013 From: juanlu001 en gmail.com (Juan Luis Cano) Date: Tue, 8 Oct 2013 12:19:05 +0200 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> References: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> Message-ID: 2013/10/8 Boris Vladimir Comi > Me falto aclarar que los promedios que obtengo con el codigo, usando > numpy, son los promedios de todos los datos y yo estoy interesado en > obtener los promedios díarios, como se puede lograr eso? > Nada más tienes que usar mean(axis=1). > ------------------------------ > *De:* Boris Vladimir Comi > *Enviado:* martes, 08 de octubre de 2013 02:43 a.m. > > *Para:* La lista de python en castellano > *Asunto:* RE: [Python-es] Promedios díarios en python > > Gracias Alberto y Kiko: > > Si tengo instaladas las librerias de numpy y pandas. Al obtener los > promedios, maximo y minimo de una base de datos de prueba cuya estructura > es como sigue: > > Fecha, lat, lon, id, humedad,temperatura,precipitacion > > Para leer los datos y obtener los estadísticos lo hago de dos maneras: > > usando numpy: > > from numpy import * > from scipy import * > import numpy as np > > > data=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=str) > > data1=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=int,usecols=[4,5]) > > print data > > [['2/5/04 6:45 AM' '19.7' '-95.2' '1' '45' '-38' '1'] > ['2/5/04 7:45 AM' '19.7' '-94.7' '1' '34' '-48' '1'] > ['2/5/04 8:45 AM' '19.3' '-93.9' '1' '57' '-60' '1'] > ['2/5/04 9:45 AM' '19' '-93.5' '1' '89' '-58' '1'] > ['2/5/04 10:45 AM' '19' '-92.8' '1' '34' '-50' '2'] > ['2/5/04 11:45 AM' '19.2' '-92.6' '1' '23' '-40' '3'] > ['2/5/04 12:45 PM' '19.9' '-93' '1' '10' '-43' '4'] > ['2/5/04 1:15 PM' '20' '-92.8' '1' '50' '-32' '2'] > ['30/5/04 4:45 AM' '23.1' '-100.2' '2' '45' '-45' '3'] > ['30/5/04 5:45 AM' '23.2' '-100' '2' '68' '-56' '2'] > ['30/5/04 6:45 AM' '23.3' '-100' '2' '90' '-48' '1'] > ['30/5/04 7:45 AM' '23.3' '-100.2' '2' '100' '-32' '1'] > ['31/5/04 3:15 AM' '23.4' '-99' '3' '12' '-36' '1'] > ['31/5/04 4:15 AM' '23.5' '-98.9' '3' '34' '-46' '1'] > ['31/5/04 5:15 AM' '23.6' '-98.7' '3' '56' '-68' '2'] > ['31/5/04 6:15 AM' '23.7' '-98.8' '3' '78' '-30' '1']] > > print 'mean:', data1.mean(axis=0) > print 'max:', data1.max(axis=0) > print 'min:', data1.min(axis=0) > > mean: [ 51.5625 -45.625 ] > max: [100 -30] > min: [ 10 -68] > > la pregunta es: como obtengo la suma unicamente de la columna > precipitacion? > > Usando pandas: > > import pandas as pd > > df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) > df > > Lat Lon ID Moisture Temperature Precipitacion > > Date > 2004-02-05 06:45:00 19.7 -95.2 1 45 -38 1 > 2004-02-05 07:45:00 19.7 -94.7 1 34 -48 1 > 2004-02-05 08:45:00 19.3 -93.9 1 57 -60 1 > 2004-02-05 09:45:00 19.0 -93.5 1 89 -58 1 > 2004-02-05 10:45:00 19.0 -92.8 1 34 -50 2 > 2004-02-05 11:45:00 19.2 -92.6 1 23 -40 3 > 2004-02-05 12:45:00 19.9 -93.0 1 10 -43 4 > 2004-02-05 13:15:00 20.0 -92.8 1 50 -32 2 > 2004-05-30 04:45:00 23.1 -100.2 2 45 -45 3 > > 2004-05-30 05:45:00 23.2 -100.0 2 68 -56 2 > 2004-05-30 06:45:00 23.3 -100.0 2 90 -48 1 > 2004-05-30 07:45:00 23.3 -100.2 2 100 -32 1 > 2004-05-31 03:15:00 23.4 -99.0 3 12 -36 1 > 2004-05-31 04:15:00 23.5 -98.9 3 34 -46 1 > 2004-05-31 05:15:00 23.6 -98.7 3 56 -68 2 > 2004-05-31 06:15:00 23.7 -98.8 3 78 -30 1 > > > Al intentar conseguir, por ejmplo la suma diaria: > > df.resample('D',how='sum') > > obtengo lo siguiente: > > Lat Lon ID Moisture Temperature > > Date > 2004-02-06 155.8 -748.5 8 342 -369 > 2004-02-07 NaN NaN NaN NaN NaN > 2004-02-08 NaN NaN NaN NaN NaN > 2004-02-09 NaN NaN NaN NaN NaN > 2004-02-10 NaN NaN NaN NaN NaN > 2004-02-11 NaN NaN NaN NaN NaN > 2004-02-12 NaN NaN NaN NaN NaN > 2004-02-13 NaN NaN NaN NaN NaN > 2004-02-14 NaN NaN NaN NaN NaN > 2004-02-15 NaN NaN NaN NaN NaN > 2004-02-16 NaN NaN NaN NaN NaN > 2004-02-17 NaN NaN NaN NaN NaN > 2004-02-18 NaN NaN NaN NaN NaN > 2004-02-19 NaN NaN NaN NaN NaN > 2004-02-20 NaN NaN NaN NaN NaN > 2004-02-21 NaN NaN NaN NaN NaN > 2004-02-22 NaN NaN NaN NaN NaN > 2004-02-23 NaN NaN NaN NaN NaN > 2004-02-24 NaN NaN NaN NaN NaN > 2004-02-25 NaN NaN NaN NaN NaN > 2004-02-26 NaN NaN NaN NaN NaN > 2004-02-27 NaN NaN NaN NaN NaN > 2004-02-28 NaN NaN NaN NaN NaN > 2004-02-29 NaN NaN NaN NaN NaN > 2004-03-01 NaN NaN NaN NaN NaN > 2004-03-02 NaN NaN NaN NaN NaN > 2004-03-03 NaN NaN NaN NaN NaN > 2004-03-04 NaN NaN NaN NaN NaN > 2004-03-05 NaN NaN NaN NaN NaN > 2004-03-06 NaN NaN NaN NaN NaN > 2004-03-07 NaN NaN NaN NaN NaN > 2004-03-08 NaN NaN NaN NaN NaN > 2004-03-09 NaN NaN NaN NaN NaN > 2004-03-10 NaN NaN NaN NaN NaN > 2004-03-11 NaN NaN NaN NaN NaN > 2004-03-12 NaN NaN NaN NaN NaN > 2004-03-13 NaN NaN NaN NaN NaN > 2004-03-14 NaN NaN NaN NaN NaN > 2004-03-15 NaN NaN NaN NaN NaN > 2004-03-16 NaN NaN NaN NaN NaN > 2004-03-17 NaN NaN NaN NaN NaN > 2004-03-18 NaN NaN NaN NaN NaN > 2004-03-19 NaN NaN NaN NaN NaN > 2004-03-20 NaN NaN NaN NaN NaN > 2004-03-21 NaN NaN NaN NaN NaN > 2004-03-22 NaN NaN NaN NaN NaN > 2004-03-23 NaN NaN NaN NaN NaN > 2004-03-24 NaN NaN NaN NaN NaN > 2004-03-25 NaN NaN NaN NaN NaN > 2004-03-26 NaN NaN NaN NaN NaN > 2004-03-27 NaN NaN NaN NaN NaN > 2004-03-28 NaN NaN NaN NaN NaN > 2004-03-29 NaN NaN NaN NaN NaN > 2004-03-30 NaN NaN NaN NaN NaN > 2004-03-31 NaN NaN NaN NaN NaN > 2004-04-01 NaN NaN NaN NaN NaN > 2004-04-02 NaN NaN NaN NaN NaN > 2004-04-03 NaN NaN NaN NaN NaN > 2004-04-04 NaN NaN NaN NaN NaN > 2004-04-05 NaN NaN NaN NaN NaN > 2004-04-06 NaN NaN NaN NaN NaN > 2004-04-07 NaN NaN NaN NaN NaN > 2004-04-08 NaN NaN NaN NaN NaN > 2004-04-09 NaN NaN NaN NaN NaN > 2004-04-10 NaN NaN NaN NaN NaN > 2004-04-11 NaN NaN NaN NaN NaN > 2004-04-12 NaN NaN NaN NaN NaN > 2004-04-13 NaN NaN NaN NaN NaN > 2004-04-14 NaN NaN NaN NaN NaN > 2004-04-15 NaN NaN NaN NaN NaN > 2004-04-16 NaN NaN NaN NaN NaN > 2004-04-17 NaN NaN NaN NaN NaN > 2004-04-18 NaN NaN NaN NaN NaN > 2004-04-19 NaN NaN NaN NaN NaN > 2004-04-20 NaN NaN NaN NaN NaN > 2004-04-21 NaN NaN NaN NaN NaN > 2004-04-22 NaN NaN NaN NaN NaN > 2004-04-23 NaN NaN NaN NaN NaN > 2004-04-24 NaN NaN NaN NaN NaN > 2004-04-25 NaN NaN NaN NaN NaN > 2004-04-26 NaN NaN NaN NaN NaN > 2004-04-27 NaN NaN NaN NaN NaN > 2004-04-28 NaN NaN NaN NaN NaN > 2004-04-29 NaN NaN NaN NaN NaN > 2004-04-30 NaN NaN NaN NaN NaN > 2004-05-01 NaN NaN NaN NaN NaN > 2004-05-02 NaN NaN NaN NaN NaN > 2004-05-03 NaN NaN NaN NaN NaN > 2004-05-04 NaN NaN NaN NaN NaN > 2004-05-05 NaN NaN NaN NaN NaN > 2004-05-06 NaN NaN NaN NaN NaN > 2004-05-07 NaN NaN NaN NaN NaN > 2004-05-08 NaN NaN NaN NaN NaN > 2004-05-09 NaN NaN NaN NaN NaN > 2004-05-10 NaN NaN NaN NaN NaN > 2004-05-11 NaN NaN NaN NaN NaN > 2004-05-12 NaN NaN NaN NaN NaN > 2004-05-13 NaN NaN NaN NaN NaN > 2004-05-14 NaN NaN NaN NaN NaN > 2004-05-15 NaN NaN NaN NaN NaN > 2004-05-16 NaN NaN NaN NaN NaN > 2004-05-17 NaN NaN NaN NaN NaN > 2004-05-18 NaN NaN NaN NaN NaN > 2004-05-19 NaN NaN NaN NaN NaN > 2004-05-20 NaN NaN NaN NaN NaN > 2004-05-21 NaN NaN NaN NaN NaN > 2004-05-22 NaN NaN NaN NaN NaN > 2004-05-23 NaN NaN NaN NaN NaN > 2004-05-24 NaN NaN NaN NaN NaN > 2004-05-25 NaN NaN NaN NaN NaN > 2004-05-26 NaN NaN NaN NaN NaN > 2004-05-27 NaN NaN NaN NaN NaN > 2004-05-28 NaN NaN NaN NaN NaN > 2004-05-29 NaN NaN NaN NaN NaN > 2004-05-30 NaN NaN NaN NaN NaN > 2004-05-31 92.9 -400.4 8 303 -181 5 > 2004-06-01 94.2 -395.4 12 180 -180 > > Hice algo mal, porque no toma en cuenta la fecha correspondiente al > 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? > > > Agradeceria su ayuda > > > ------------------------------ > *De:* Python-es > en nombre de Alberto Chamorro > *Enviado:* martes, 08 de octubre de 2013 01:06 a.m. > *Para:* La lista de python en castellano > *Asunto:* Re: [Python-es] Promedios díarios en python > > > Y la pregunta sobre Python es.... > > ¿Tienes algún algoritmo que hayas intentado hacer al menos? > > Alberto > > Tengo datos mensuales estructurados en la siguiente manera > > Fecha,Time, Humedad, Temperatura, Precipitación Acumulada > 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, > . > . > . > .1/01/2011, 23:45, 22, 40, 0, > . > . > . > .31/01/2011, 00:00, 23, 45, 0, > > Como puedo conseguir los promedios díarios de las variables Temperatura y > Humedad así como la suma díaria de la Precipitacion Acumulada? > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Juanlu ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nadaird en gmail.com Tue Oct 8 13:19:45 2013 From: nadaird en gmail.com (Guillermo Vaya) Date: Tue, 8 Oct 2013 13:19:45 +0200 Subject: [Python-es] Duda con ejecutar funciones en un HTTP POST In-Reply-To: References: Message-ID: El metodo post sirve para eso, si y "suele" devolver un 201 si consigue crear el recurso o un 4XX/5XX segun sea el tipo de fallo. No tengo muy claras algunas cosas, ¿como quieres utilizar threads o mysql para resolverlo? son librerias muy diferentes e implican una solucion distinta, que no termino de ver como metodo para hacer una segunda petición post. P.D.: Si el español no es tu primer lenguaje, pero estás intentando aprender, igual ayudaría tener el mensaje original en ingles para poder orientarnos con lo que querías decir en caso de duda :S 2013/10/8 Rafael Gomes > Buenos Dias, > Como están? > Espero que bien :). > > Disculpen molestar, pero es que tengo una duda conceptual a desarrollar un > metodo HTTP POST en un servidor REST utilizando la herramienta bootle del > Python. > > El metodo HTTP POST sirve para el envio de información por parte del > cliente al servidor para crear un determinado recurso correcto? Por tal > motivo luego es devolvido el número de identificacion del recurso creado o > consequentemente el mensaje que no pudimos crear el recurso correcto? > > Mi duda es la siguiente: yo quiero en este método devolver el número de > identificación para el cliente y después de esto ejecutar otra función que > va realizar otra petición POST para otro servidor para efectuar la > activación de otros recursos. Todo esto dentro del primero pedido del > cliente. > > Para este problema pensé utilizar threads o utilizar una mySQL a fin de > simplificar el problema. Pero no se si estoy pensando bien. > > Si me pudiesen ayudar agradecia :). > > Continuación de un buen dia. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rggg88 en hotmail.com Tue Oct 8 14:39:28 2013 From: rggg88 en hotmail.com (Rafael Gomes) Date: Tue, 8 Oct 2013 13:39:28 +0100 Subject: [Python-es] Duda con ejecutar funciones en un HTTP POST In-Reply-To: References: , Message-ID: Hola :). El español es mi primer lenguaje solo que llevo 8 años a vivir fuera de España y hay algunas cosas que ya me cuesta transmitir :). Gracias por la sugestion. Sobre la forma como lo pretendo resolver es lo siguiente: Al me hacer un HTTP POST creo una série de archivos con la información de los recursos, lo que para mi pequeña plataforma funciona, pero para una plataforma mayor puede no servir, de ahi que pense en la mySQL. Pero segun estube a leer en las páginas e información del Python puedo utilizar los threads. Ya que mi intención es lanzar un proceso para la creación de recursos en otro servidor en el primer POST que recibe mi plataforma. El flujograma que puede definir mi plataforma es: Envio del HTTP POST por parte del bloco superior -----> Mi plataforma Dentro de mi plataforma en el método POST recibo y envio el mensaje 201 después de haber hecho el httpPOST para el otro servidor, solo que esto asi no respeta las reglas de una arquitectura REST. Entonces lo que estoy pensando hacer es activar un thread para activar los servicios/recursos en el otro servidor y despues devolver el 201. Gracias por tu ayuda. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nadaird en gmail.com Tue Oct 8 15:28:39 2013 From: nadaird en gmail.com (Guillermo Vaya) Date: Tue, 8 Oct 2013 15:28:39 +0200 Subject: [Python-es] Duda con ejecutar funciones en un HTTP POST In-Reply-To: References: Message-ID: " Entonces lo que estoy pensando hacer es activar un thread para activar los servicios/recursos en el otro servidor y después devolver el 201." Pero en este caso no tendrías necesidad de usar threads, ya que no es un proceso concurrente, sino secuencial porque estarías esperando a recibir la respuesta del segundo POST. El hecho de que la petición, genere acciones posteriores no está reñido con REST. Por ejemplo el recurso podria tener un estado de "construyéndose" y ser devuelto antes de la segunda petición POST, por lo que fácilmente podrías tener Mysql (o ficheros) y threads. La decisión de Mysql o ficheros dependerá mucho de tu plataforma, pero no afecta a las peticiones POST. 2013/10/8 Rafael Gomes > Hola :). > > El español es mi primer lenguaje solo que llevo 8 años a vivir fuera de > España y hay algunas cosas que ya me cuesta transmitir :). > Gracias por la sugestion. > > Sobre la forma como lo pretendo resolver es lo siguiente: Al me hacer un > HTTP POST creo una série de archivos con la información de los recursos, lo > que para mi pequeña plataforma funciona, pero para una plataforma mayor > puede no servir, de ahi que pense en la mySQL. Pero segun estube a leer en > las páginas e información del Python puedo utilizar los threads. Ya que mi > intención es lanzar un proceso para la creación de recursos en otro > servidor en el primer POST que recibe mi plataforma. > > El flujograma que puede definir mi plataforma es: > > Envio del HTTP POST por parte del bloco superior -----> Mi plataforma > > Dentro de mi plataforma en el método POST recibo y envio el mensaje 201 > después de haber hecho el httpPOST para el otro servidor, solo que esto asi > no respeta las reglas de una arquitectura REST. Entonces lo que estoy > pensando hacer es activar un thread para activar los servicios/recursos en > el otro servidor y despues devolver el 201. > > Gracias por tu ayuda. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From diego.uribe.gamez en gmail.com Tue Oct 8 19:30:54 2013 From: diego.uribe.gamez en gmail.com (DiegoUG) Date: Tue, 8 Oct 2013 12:30:54 -0500 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? Message-ID: Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda con algún ejemplo claro? Gracias. -- *Diego Alonso Uribe Gamez* ------------------------------ *Desarrollador web* Twitter: @DiegoUG Google+: http://gplus.to/diegoug ------------------------------ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From razpeitia en gmail.com Tue Oct 8 19:34:39 2013 From: razpeitia en gmail.com (Ricardo Azpeitia Pimentel) Date: Tue, 8 Oct 2013 12:34:39 -0500 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: Aprender algo de python no estaría de mas. http://mundogeek.net/archivos/2008/03/03/python-funciones/ El 8 de octubre de 2013 12:30, DiegoUG escribió: > Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo > mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo > como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un > objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda > con algún ejemplo claro? > > Gracias. > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > ------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From reroes799 en gmail.com Tue Oct 8 19:46:12 2013 From: reroes799 en gmail.com (=?ISO-8859-1?Q?Ren=E9_Rolando_Elizalde_Solano?=) Date: Tue, 8 Oct 2013 12:46:12 -0500 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: +1 El 8 de octubre de 2013 12:34, Ricardo Azpeitia Pimentel < razpeitia en gmail.com> escribió: > Aprender algo de python no estaría de mas. > > http://mundogeek.net/archivos/2008/03/03/python-funciones/ > > > El 8 de octubre de 2013 12:30, DiegoUG escribió: > >> Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo >> mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo >> como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un >> objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda >> con algún ejemplo claro? >> >> Gracias. >> >> -- >> *Diego Alonso Uribe Gamez* >> ------------------------------ >> >> *Desarrollador web* >> >> Twitter: @DiegoUG >> >> Google+: http://gplus.to/diegoug >> ------------------------------ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- René Rolando Elizalde Solano *Ingeniero en Sistemas* *Analista - *Programador *PYTHON, HTML, CSS, JQUERY, SQLALCHEMY* * * http://reroes79.wordpress.com http://reroes799.blogspot.com/ http://twitter.com/reroes http://www.facebook.com/reroes799 *rrelizalde en utpl.edu.ec* reroes79 en hotmail.com reroes79 en yahoo.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lastvnm en gmail.com Tue Oct 8 19:55:35 2013 From: lastvnm en gmail.com (Hiko hitokiri) Date: Tue, 8 Oct 2013 11:55:35 -0600 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: a qui no lo explican a fondo pero por lo menos queda claro el concepto https://www.youtube.com/watch?v=J9tfIigFIqM ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Tue Oct 8 20:09:00 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Tue, 8 Oct 2013 14:09:00 -0400 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: en la documentacion oficial de python puede leer sobre el tema http://docs.python.org/2/tutorial/controlflow.html#more-on-defining-functions El 8 de octubre de 2013 13:30, DiegoUG escribió: > Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo > mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo > como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un > objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda > con algún ejemplo claro? > > Gracias. > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > ------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From juanlu001 en gmail.com Tue Oct 8 20:15:37 2013 From: juanlu001 en gmail.com (Juan Luis Cano) Date: Tue, 08 Oct 2013 20:15:37 +0200 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: <52544BC9.5050103@gmail.com> On 10/08/2013 07:34 PM, Ricardo Azpeitia Pimentel wrote: > Aprender algo de python no estaría de mas. > > http://mundogeek.net/archivos/2008/03/03/python-funciones/ Efectivamente, en este tutorial explica la sintaxis *args y **kwargs. Realmente args y kwargs puede ser cualquier cosa: *params y **kwparams, *otros y **otros... Lo de poner *args y **kwargs es una convención dentro de Python. En el tutorial oficial de Python traducido al español lo explican también: http://docs.python.org.ar/tutorial/3/controlflow.html#mas-sobre-definicion-de-funciones > > > El 8 de octubre de 2013 12:30, DiegoUG > escribió: > > Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo > veo mucho cuando definen un def do(self, *args, **kwargs): pero no > entiendo como funciona, veo que a **kwargs le estan pasando un > arreglo y a *args un objeto user, pero la verdad no entiendo, > alguien me puede sacar de la duda con algún ejemplo claro? > > Gracias. > > -- > *Diego Alonso Uribe Gamez* > ------------------------------------------------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > > ------------------------------------------------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Wed Oct 9 20:58:38 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Wed, 9 Oct 2013 14:58:38 -0400 Subject: [Python-es] distutils: como generar el fichero de SPECS de RPM? Message-ID: Hola, estoy ahora mismo buscando info en google sobre como hacerlo. Pero si alguien conoce de algun link donde venga explicado, estaria mas que agradecido. Quisiera usar distutils, pero sin crear el RPM. Solo estoy interesado en este momento en generar el fichero de SPECS. Como digo, cualquier ayuda mientras sigo buscando en la web sera mas que bienvenida. Muchas gracias por adelantado. Perdon por la ausencia de tildes. Jose From jcaballero.hep en gmail.com Wed Oct 9 21:18:44 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Wed, 9 Oct 2013 15:18:44 -0400 Subject: [Python-es] distutils: como generar el fichero de SPECS de RPM? In-Reply-To: References: Message-ID: Me contesto a mi mismo: $ python setup.py bdist_rpm --spec-only El día 9 de octubre de 2013 14:58, Jose Caballero escribió: > Hola, > > > > estoy ahora mismo buscando info en google sobre como hacerlo. > Pero si alguien conoce de algun link donde venga explicado, estaria > mas que agradecido. > > Quisiera usar distutils, pero sin crear el RPM. Solo estoy interesado > en este momento en generar el fichero de SPECS. > > Como digo, cualquier ayuda mientras sigo buscando en la web sera mas > que bienvenida. > > > > Muchas gracias por adelantado. Perdon por la ausencia de tildes. > Jose From diego.uribe.gamez en gmail.com Thu Oct 10 00:18:09 2013 From: diego.uribe.gamez en gmail.com (DiegoUG) Date: Wed, 9 Oct 2013 17:18:09 -0500 Subject: [Python-es] como saber cual es el size de un JSON? Message-ID: necesito saber cual es el size o el peso en megabits de una lista {} hecha en JSON como puedo hacer esto usando python? -- *Diego Alonso Uribe Gamez* ------------------------------ *Desarrollador web* Twitter: @DiegoUG Google+: http://gplus.to/diegoug ------------------------------ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From cristian99garcia en gmail.com Thu Oct 10 00:35:32 2013 From: cristian99garcia en gmail.com (=?ISO-8859-1?Q?Cristian_Garc=EDa?=) Date: Wed, 9 Oct 2013 20:35:32 -0200 Subject: [Python-es] como saber cual es el size de un JSON? In-Reply-To: References: Message-ID: Si te refieres al archivo.json entero, es muy simple, una función en os.path que te lo hace ;) import os os.path.getsize('/DIRECTORIO/ARCHIVO.json') Ahora, el problema es que devuelve lo que pesa el archivo en bytes, solo hay que dividir un par de veces en 1024 ;), espero que sirva. El 9 de octubre de 2013 20:18, DiegoUG escribió: > necesito saber cual es el size o el peso en megabits de una lista {} hecha > en JSON > > como puedo hacer esto usando python? > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > ------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From harenson en gmail.com Thu Oct 10 00:36:35 2013 From: harenson en gmail.com (Harenson Henao) Date: Wed, 9 Oct 2013 17:36:35 -0500 Subject: [Python-es] como saber cual es el size de un JSON? In-Reply-To: References: Message-ID: Hola, tal vez el contenido de este enlace te ayude a despejar tu duda. http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python Saludos. El 9 de octubre de 2013 17:18, DiegoUG escribió: > necesito saber cual es el size o el peso en megabits de una lista {} hecha > en JSON > > como puedo hacer esto usando python? > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > ------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From chack14rock en gmail.com Tue Oct 8 19:34:56 2013 From: chack14rock en gmail.com (=?ISO-8859-1?Q?Charly_Rom=E1n?=) Date: Tue, 8 Oct 2013 12:34:56 -0500 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: Deberías tomar un buen manual de python antes de seguir con django u otros Frameworks. Esto es básico. Para leer: http://www.juanjoconti.com.ar/2010/10/13/entendiendo-args-y-kwargs-en-python/ Saludos! El 8 de octubre de 2013 12:30, DiegoUG escribió: > Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo > mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo > como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un > objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda > con algún ejemplo claro? > > Gracias. > > -- > *Diego Alonso Uribe Gamez* > ------------------------------ > > *Desarrollador web* > > Twitter: @DiegoUG > > Google+: http://gplus.to/diegoug > ------------------------------ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From diego.uribe.gamez en gmail.com Thu Oct 10 14:42:09 2013 From: diego.uribe.gamez en gmail.com (DiegoUG) Date: Thu, 10 Oct 2013 07:42:09 -0500 Subject: [Python-es] alguien me puede explicar que es (*args, **kwargs)? In-Reply-To: References: Message-ID: Gracias a todos por sus respuestas, igual sigo trabajando, ya entendí. Correo enviado desde el Celular El 10/10/2013 02:32, "Charly Román" escribió: > Deberías tomar un buen manual de python antes de seguir con django u otros > Frameworks. Esto es básico. > > Para leer: > http://www.juanjoconti.com.ar/2010/10/13/entendiendo-args-y-kwargs-en-python/ > > Saludos! > > > El 8 de octubre de 2013 12:30, DiegoUG escribió: > >> Resulta que yo nunca use esto en python (*args, **kwargs) ahora lo veo >> mucho cuando definen un def do(self, *args, **kwargs): pero no entiendo >> como funciona, veo que a **kwargs le estan pasando un arreglo y a *args un >> objeto user, pero la verdad no entiendo, alguien me puede sacar de la duda >> con algún ejemplo claro? >> >> Gracias. >> >> -- >> *Diego Alonso Uribe Gamez* >> ------------------------------ >> >> *Desarrollador web* >> >> Twitter: @DiegoUG >> >> Google+: http://gplus.to/diegoug >> ------------------------------ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jhaguilar en gmail.com Thu Oct 10 17:27:26 2013 From: jhaguilar en gmail.com (Julio Hector Aguilar Renteria) Date: Thu, 10 Oct 2013 10:27:26 -0500 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: Cordial Saludo Hola buenos días, quisiera saber si es posible hacer que un script python siempre tenga el mismo pid, tengo varios scripts python y en ocasiones es necesario detener e iniciar nuevamente un script y quiero hacerlo de manera automatica. Muchas Gracias Atentamente, *Jhaguilar* ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From sdeancos en gmail.com Fri Oct 11 08:47:37 2013 From: sdeancos en gmail.com (Samuel de Ancos) Date: Fri, 11 Oct 2013 08:47:37 +0200 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: Buenos días! Quizás puedes utilizar Supervisord para gestionar tu proceso. He aquí mas información http://supervisord.org Saludos. Cordial Saludo Hola buenos días, quisiera saber si es posible hacer que un script python siempre tenga el mismo pid, tengo varios scripts python y en ocasiones es necesario detener e iniciar nuevamente un script y quiero hacerlo de manera automatica. Muchas Gracias Atentamente, *Jhaguilar* _______________________________________________ Python-es mailing list Python-es en python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From miguelglafuente en gmail.com Fri Oct 11 09:16:08 2013 From: miguelglafuente en gmail.com (Rock Neurotiko) Date: Fri, 11 Oct 2013 07:16:08 +0000 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: Por el bien de tu sistema operativo, ni pienses en eso, y deja que el gestione los pid's, porque si no puedes tener un lio de la ostia. Si quieres saber el pid es tan facil como: ps aux | grep 'tuScript' | awk '{print $2}' Si quieres matarlo en la misma linea: kill $(ps aux | grep 'tuScript' | awk '{print $2}') El 10 de octubre de 2013 15:27, Julio Hector Aguilar Renteria < jhaguilar en gmail.com> escribió: > Cordial Saludo > > Hola buenos días, quisiera saber si es posible hacer que un script python > siempre tenga el mismo pid, tengo varios scripts python y en ocasiones es > necesario detener e iniciar nuevamente un script y quiero hacerlo de manera > automatica. > > Muchas Gracias > > > Atentamente, > > > *Jhaguilar* > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Miguel García Lafuente - Rock Neurotiko Do it, the devil is in the details. The quieter you become, the more you are able to hear. If we make consistent effort, based on proper education, we can change the world. El contenido de este e-mail es privado, no se permite la revelacion del contenido de este e-mail a gente ajena a él. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From juanlu001 en gmail.com Fri Oct 11 09:19:31 2013 From: juanlu001 en gmail.com (Juan Luis Cano) Date: Fri, 11 Oct 2013 09:19:31 +0200 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: ?pidof script.py? es mucho más simple On Oct 11, 2013 9:17 AM, "Rock Neurotiko" wrote: > Por el bien de tu sistema operativo, ni pienses en eso, y deja que el > gestione los pid's, porque si no puedes tener un lio de la ostia. > > Si quieres saber el pid es tan facil como: > > ps aux | grep 'tuScript' | awk '{print $2}' > > Si quieres matarlo en la misma linea: > > kill $(ps aux | grep 'tuScript' | awk '{print $2}') > > > > > El 10 de octubre de 2013 15:27, Julio Hector Aguilar Renteria < > jhaguilar en gmail.com> escribió: > >> Cordial Saludo >> >> Hola buenos días, quisiera saber si es posible hacer que un script python >> siempre tenga el mismo pid, tengo varios scripts python y en ocasiones es >> necesario detener e iniciar nuevamente un script y quiero hacerlo de manera >> automatica. >> >> Muchas Gracias >> >> >> Atentamente, >> >> >> *Jhaguilar* >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Miguel García Lafuente - Rock Neurotiko > > Do it, the devil is in the details. > The quieter you become, the more you are able to hear. > If we make consistent effort, based on proper education, we can change the > world. > > El contenido de este e-mail es privado, no se permite la revelacion del > contenido de este e-mail a gente ajena a él. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From miguelglafuente en gmail.com Fri Oct 11 09:24:00 2013 From: miguelglafuente en gmail.com (Rock Neurotiko) Date: Fri, 11 Oct 2013 07:24:00 +0000 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: Vaya no lo conocia :) No esta mal, pero sigo prefiriendo saber lo que se toca no me fio de nada xD), y saber hacerlo de otros modos sin herramientas viene muy bien cuando no las tienes :P El 11 de octubre de 2013 07:19, Juan Luis Cano escribió: > ?pidof script.py? es mucho más simple > On Oct 11, 2013 9:17 AM, "Rock Neurotiko" > wrote: > >> Por el bien de tu sistema operativo, ni pienses en eso, y deja que el >> gestione los pid's, porque si no puedes tener un lio de la ostia. >> >> Si quieres saber el pid es tan facil como: >> >> ps aux | grep 'tuScript' | awk '{print $2}' >> >> Si quieres matarlo en la misma linea: >> >> kill $(ps aux | grep 'tuScript' | awk '{print $2}') >> >> >> >> >> El 10 de octubre de 2013 15:27, Julio Hector Aguilar Renteria < >> jhaguilar en gmail.com> escribió: >> >>> Cordial Saludo >>> >>> Hola buenos días, quisiera saber si es posible hacer que un script >>> python siempre tenga el mismo pid, tengo varios scripts python y en >>> ocasiones es necesario detener e iniciar nuevamente un script y quiero >>> hacerlo de manera automatica. >>> >>> Muchas Gracias >>> >>> >>> Atentamente, >>> >>> >>> *Jhaguilar* >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >> >> >> -- >> Miguel García Lafuente - Rock Neurotiko >> >> Do it, the devil is in the details. >> The quieter you become, the more you are able to hear. >> If we make consistent effort, based on proper education, we can change >> the world. >> >> El contenido de este e-mail es privado, no se permite la revelacion del >> contenido de este e-mail a gente ajena a él. >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Miguel García Lafuente - Rock Neurotiko Do it, the devil is in the details. The quieter you become, the more you are able to hear. If we make consistent effort, based on proper education, we can change the world. El contenido de este e-mail es privado, no se permite la revelacion del contenido de este e-mail a gente ajena a él. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From funollet en fastmail.fm Fri Oct 11 11:43:47 2013 From: funollet en fastmail.fm (Jordi Funollet Pujol) Date: Fri, 11 Oct 2013 11:43:47 +0200 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: <5257C853.80602@fastmail.fm> On 10/11/2013 09:24 AM, Rock Neurotiko wrote: > No esta mal, pero sigo prefiriendo saber lo que se toca no me fio de > nada xD), y saber hacerlo de otros modos sin herramientas viene muy bien > cuando no las tienes :P Sana actitud. Tan sana como conocer las herramientas estándar del entorno. -- Jordi Funollet Pujol http://www.linkedin.com/in/jordifunollet From funollet en fastmail.fm Fri Oct 11 11:48:19 2013 From: funollet en fastmail.fm (Jordi Funollet Pujol) Date: Fri, 11 Oct 2013 11:48:19 +0200 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: <5257C963.40506@fastmail.fm> Dale un vistazo a 'daemoncmd'; aunque la librería en sí no sea exactamente lo que buscas, la explicación te orientará sobre que pasos necesitas hacer (y cuales es mejor evitar). https://pypi.python.org/pypi/daemoncmd/0.2.0 -- Jordi Funollet Pujol http://www.linkedin.com/in/jordifunollet From alfredo.riguetti en ptravel.com.uy Fri Oct 11 20:51:26 2013 From: alfredo.riguetti en ptravel.com.uy (Alfredo Riguetti) Date: Fri, 11 Oct 2013 16:51:26 -0200 Subject: [Python-es] mostrando cifras Message-ID: <525848AE.206@ptravel.com.uy> Hola a todos, estoy trabajando con cifras float y necesito formatear el mostreo de la misma para los decimales estoy usando esto : para un numero 2500659.26598 cifra = '%.2f' y me muestra 2500659.26 perfecto. pero quiero mostrar 2.500.659.26 como hago esto? muchas gracias a todos . Saludos Alfredo From harenson en gmail.com Fri Oct 11 21:27:39 2013 From: harenson en gmail.com (Harenson Henao) Date: Fri, 11 Oct 2013 14:27:39 -0500 Subject: [Python-es] mostrando cifras In-Reply-To: <525848AE.206@ptravel.com.uy> References: <525848AE.206@ptravel.com.uy> Message-ID: fíjate en este enlace http://djangosnippets.org/snippets/682/ , aquí tienes otro http://code.activestate.com/recipes/473872-number-format-function-a-la-php/. Lo que hice fue buscar un equivalente a la función number_format de php http://php.net/manual/es/function.number-format.php Saludos. El 11 de octubre de 2013 13:51, Alfredo Riguetti < alfredo.riguetti en ptravel.com.uy> escribió: > Hola a todos, > estoy trabajando con cifras float y necesito formatear el mostreo de la > misma > para los decimales estoy usando esto : > > para un numero 2500659.26598 > cifra = '%.2f' y me muestra 2500659.26 perfecto. > > pero quiero mostrar 2.500.659.26 > como hago esto? > > muchas gracias a todos . > > Saludos > Alfredo > > ______________________________**_________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/**mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.**com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From moises.brenes en gmail.com Fri Oct 11 21:24:14 2013 From: moises.brenes en gmail.com (Moises Brenes) Date: Fri, 11 Oct 2013 13:24:14 -0600 Subject: [Python-es] mostrando cifras In-Reply-To: <525848AE.206@ptravel.com.uy> References: <525848AE.206@ptravel.com.uy> Message-ID: lo que quieres es un separador de centenas, usa format: http://stackoverflow.com/questions/5513615/add-thousands-separators-to-a-number 2013/10/11 Alfredo Riguetti > Hola a todos, > estoy trabajando con cifras float y necesito formatear el mostreo de la > misma > para los decimales estoy usando esto : > > para un numero 2500659.26598 > cifra = '%.2f' y me muestra 2500659.26 perfecto. > > pero quiero mostrar 2.500.659.26 > como hago esto? > > muchas gracias a todos . > > Saludos > Alfredo > > ______________________________**_________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/**mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.**com/ > -- Moises Brenes - gin.github.com ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From glez_b en comunidad.unam.mx Sat Oct 12 02:59:07 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Sat, 12 Oct 2013 00:59:07 +0000 Subject: [Python-es] Como obtener promedios diarios Message-ID: <3d8f152c15a14718be2b322788f04f13@CO1PR07MB316.namprd07.prod.outlook.com> Yo encontr? un camino para crear promedios d?arios de muchas variables, por ejemplo de una base de datos que tiene la siguiente estructura: Fecha,Time, DirViento, MagViento, Temperatura, Humedad, PreciAcu. Cada columna tiene datos d?arios registrados cada 15 minutos en un archivo que contiene los 30 d?as del mes. Yo comparto el codigo que con ayuda de ustedes he adaptado a mi proyecto. El codigo calcula los promedios . The code calcula los promedios d?arios de las columnas Temperatura y Humedad asi como tambien la suma de la columna PreciAcu. El codigo es: import numpy as np import pandas as pd from numpy import * from pandas import * from scipy import * data = pd.read_csv('tancoyol.csv') index5=data.set_index(['Fecha','Hora'],inplace=True) grouped = index5.groupby(level=0) stat_cea=grouped.agg({'Temperatura':np.mean,'Humedad':np.mean,'PreciAcu':np.sum}) Ahora yo tengo una preguntas m?s, como convertir a radianes la columna DirViento y como agregar la nueva columna obtenida a mi archivo de datos? En concreto, yo necesito obtener tres columnas a partir de la columna DirViento y agregarlas a mi archivo de datos. Fecha_Time DirViento rad sin_rad cos_rad 1/07/2011 00:00:00 334 1/07/2011 00:15:00 200 1/07/2011 00:30:00 178 1/07/2011 00:45:00 245 2/07/2011 00:00:00 100 2/07/2011 00:15:00 120 2/07/2011 00:30:00 87 2/07/2011 00:45:00 10 Primero, necesito convertir los valores de la columna DirViento a radianes(?sta ser?a la nueva columna llamada rad). Segundo, obtener el seno de cada uno de los elementos de la columna rad (?sta nueva columna ser?a llamada sin_rad) Tercero, obtener el coseno de la columna rad(Esta nueva columna ser?a llamada cos_rad) Tienen alguna idea de como lograr esto? ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jhaguilar en gmail.com Fri Oct 11 21:33:42 2013 From: jhaguilar en gmail.com (Julio Hector Aguilar Renteria) Date: Fri, 11 Oct 2013 14:33:42 -0500 Subject: [Python-es] Fwd: PID Python In-Reply-To: References: Message-ID: Hola muchas gracias por las respuestas, me sirvieron mucho. El 11 de octubre de 2013 02:16, Rock Neurotikoescribió: > Por el bien de tu sistema operativo, ni pienses en eso, y deja que el > gestione los pid's, porque si no puedes tener un lio de la ostia. > > Si quieres saber el pid es tan facil como: > > ps aux | grep 'tuScript' | awk '{print $2}' > > Si quieres matarlo en la misma linea: > > kill $(ps aux | grep 'tuScript' | awk '{print $2}') > > > > > El 10 de octubre de 2013 15:27, Julio Hector Aguilar Renteria < > jhaguilar en gmail.com> escribió: > >> Cordial Saludo >> >> Hola buenos días, quisiera saber si es posible hacer que un script python >> siempre tenga el mismo pid, tengo varios scripts python y en ocasiones es >> necesario detener e iniciar nuevamente un script y quiero hacerlo de manera >> automatica. >> >> Muchas Gracias >> >> >> Atentamente, >> >> >> *Jhaguilar* >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Miguel García Lafuente - Rock Neurotiko > > Do it, the devil is in the details. > The quieter you become, the more you are able to hear. > If we make consistent effort, based on proper education, we can change the > world. > > El contenido de este e-mail es privado, no se permite la revelacion del > contenido de este e-mail a gente ajena a él. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Cordial Saludo Muchas Gracias Atentamente, *Julio Hector Aguilar Renteria *Celular: 315 331 7344 Skype: jharvao MSN: jharvao en hotmail.com Cali - Colombia ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From fdanesse en gmail.com Sat Oct 12 15:04:30 2013 From: fdanesse en gmail.com (Flavio Danesse) Date: Sat, 12 Oct 2013 11:04:30 -0200 Subject: [Python-es] Como obtener promedios diarios In-Reply-To: <3d8f152c15a14718be2b322788f04f13@CO1PR07MB316.namprd07.prod.outlook.com> References: <3d8f152c15a14718be2b322788f04f13@CO1PR07MB316.namprd07.prod.outlook.com> Message-ID: from math import radians radianes = radians(angulo) El 11 de octubre de 2013 22:59, Boris Vladimir Comi < glez_b en comunidad.unam.mx> escribió: > Yo encontré un camino para crear promedios díarios de muchas > variables, por ejemplo de una base de datos que tiene la siguiente > estructura: > > Fecha,Time, DirViento, MagViento, Temperatura, Humedad, PreciAcu. > > Cada columna tiene datos díarios registrados cada 15 minutos en un archivo > que contiene los 30 días del mes. Yo comparto el codigo que con ayuda de > ustedes he adaptado a mi proyecto. El codigo calcula los promedios . The > code calcula los promedios díarios de las columnas Temperatura y Humedad > asi como tambien la suma de la columna PreciAcu. > > El codigo es: > > > import numpy as np > import pandas as pd > from numpy import * > from pandas import * > from scipy import * > > data = pd.read_csv('tancoyol.csv') > index5=data.set_index(['Fecha','Hora'],inplace=True) > grouped = index5.groupby(level=0) > stat_cea=grouped.agg({'Temperatura':np.mean,'Humedad':np.mean,'PreciAcu': > np.sum}) > > > Ahora yo tengo una preguntas más, como convertir a radianes la columna > DirViento y como agregar la nueva columna obtenida a mi archivo de datos? > > En concreto, yo necesito obtener tres columnas a partir de la columna > DirViento y agregarlas a mi archivo de datos. > > Fecha_Time DirViento rad sin_rad cos_rad > 1/07/2011 00:00:00 334 > 1/07/2011 00:15:00 200 > 1/07/2011 00:30:00 178 > 1/07/2011 00:45:00 245 > 2/07/2011 00:00:00 100 > 2/07/2011 00:15:00 120 > 2/07/2011 00:30:00 87 > 2/07/2011 00:45:00 10 > > Primero, necesito convertir los valores de la columna DirViento a > radianes(ésta sería la nueva columna llamada rad). > > Segundo, obtener el seno de cada uno de los elementos de la columna rad > (ésta nueva columna sería llamada sin_rad) > > Tercero, obtener el coseno de la columna rad(Esta nueva columna sería > llamada cos_rad) > > Tienen alguna idea de como lograr esto? > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rjs4320-1 en yahoo.com.ar Sun Oct 13 02:48:24 2013 From: rjs4320-1 en yahoo.com.ar (Ramiro) Date: Sat, 12 Oct 2013 17:48:24 -0700 (PDT) Subject: [Python-es] Integrar OpenOffice-CALC en un programa python Message-ID: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> Hola            ¿Es posible ver una planilla de cálculo de OpenOffice como si fuera un control de formulario más en pyGTK?, (al estilo OLE2 de windows) saludos Ramiro From jza en oooes.org Sun Oct 13 06:07:09 2013 From: jza en oooes.org (Alexandro Colorado) Date: Sat, 12 Oct 2013 23:07:09 -0500 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> Message-ID: Es un reto interesante, tu puedes controlar OpenOffice remotamente via python, y OpenOffice puede funcionar como un servicio. Sin embargo no se eso de 'embedir' el workspace de Calc dentro de una ventana en GTK. Quizas, por su cercania al framework tengas mejor suerte usando Gnumerics. O puedes usar calc como servicio y hacer el intercambio de datos. Algo similar a lo que se hizo con Java/Javascript en esta aplicacion: http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html On 10/12/13, Ramiro wrote: > Hola > > > ¿Es posible ver una planilla de cálculo de OpenOffice como si > fuera un control de formulario más en pyGTK?, (al estilo OLE2 de windows) > > > > > > > saludos > > Ramiro > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Alexandro Colorado Apache OpenOffice Contributor http://www.openoffice.org From zodman en gmail.com Mon Oct 14 00:25:52 2013 From: zodman en gmail.com (Andres Vargas - zodman) Date: Sun, 13 Oct 2013 17:25:52 -0500 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> Message-ID: usa relatorio! El 12 de octubre de 2013 23:07, Alexandro Colorado escribió: > Es un reto interesante, tu puedes controlar OpenOffice remotamente via > python, y OpenOffice puede funcionar como un servicio. Sin embargo no > se eso de 'embedir' el workspace de Calc dentro de una ventana en GTK. > > Quizas, por su cercania al framework tengas mejor suerte usando > Gnumerics. O puedes usar calc como servicio y hacer el intercambio de > datos. Algo similar a lo que se hizo con Java/Javascript en esta > aplicacion: > http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html > > On 10/12/13, Ramiro wrote: > > Hola > > > > > > ¿Es posible ver una planilla de cálculo de OpenOffice como si > > fuera un control de formulario más en pyGTK?, (al estilo OLE2 de windows) > > > > > > > > > > > > > > saludos > > > > Ramiro > > _______________________________________________ > > Python-es mailing list > > Python-es en python.org > > https://mail.python.org/mailman/listinfo/python-es > > FAQ: http://python-es-faq.wikidot.com/ > > > > > -- > Alexandro Colorado > Apache OpenOffice Contributor > http://www.openoffice.org > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Andres Vargas www.zodman.com.mx ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nachoel01 en gmail.com Mon Oct 14 21:35:43 2013 From: nachoel01 en gmail.com (=?UTF-8?Q?Ignacio_Rodr=C3=ADguez?=) Date: Mon, 14 Oct 2013 17:35:43 -0200 Subject: [Python-es] mostrando cifras In-Reply-To: References: <525848AE.206@ptravel.com.uy> Message-ID: Hace unos días un amigo tenía la misma duda.. Con format (mirando obviamente StackOverFlow) logre formatear el texto/número Asi fue lo que hice: http://pastebin.ubuntu.com/6219592/ El 11/10/13, Moises Brenes escribió: > lo que quieres es un separador de centenas, usa format: > http://stackoverflow.com/questions/5513615/add-thousands-separators-to-a-number > > > 2013/10/11 Alfredo Riguetti > >> Hola a todos, >> estoy trabajando con cifras float y necesito formatear el mostreo de la >> misma >> para los decimales estoy usando esto : >> >> para un numero 2500659.26598 >> cifra = '%.2f' y me muestra 2500659.26 perfecto. >> >> pero quiero mostrar 2.500.659.26 >> como hago esto? >> >> muchas gracias a todos . >> >> Saludos >> Alfredo >> >> ______________________________**_________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/**mailman/listinfo/python-es >> FAQ: >> http://python-es-faq.wikidot.**com/ >> > > > > -- > Moises Brenes - gin.github.com > -- Saludos. Ignacio Rodríguez From eventgrafic en gmail.com Mon Oct 14 21:54:58 2013 From: eventgrafic en gmail.com (Eduard Diaz) Date: Mon, 14 Oct 2013 21:54:58 +0200 Subject: [Python-es] mostrando cifras In-Reply-To: References: <525848AE.206@ptravel.com.uy> Message-ID: Hola Ignacio, he mirado el código y donde escribes if type(numero) == str: es mejor utilizar if isinstance(numero, str): Las diferencias entre uno y otro las puedes comprobar asi: >>> foo = {} >>> type(foo) >>> class MyDict(dict): ... pass >>> bar = MyDict() >>> type(bar) >>> type(bar) == dict False >>> isinstance(bar, dict) True teniendo en cuenta que "bar" es un diccionario, hereda de él, el uso de "isinstance" es mejor para estas comprobaciones Saludos From nachoel01 en gmail.com Mon Oct 14 22:00:17 2013 From: nachoel01 en gmail.com (=?UTF-8?Q?Ignacio_Rodr=C3=ADguez?=) Date: Mon, 14 Oct 2013 18:00:17 -0200 Subject: [Python-es] mostrando cifras In-Reply-To: References: <525848AE.206@ptravel.com.uy> Message-ID: Oh! Gracias, no tenía idea! Muchas Gracias :) Saludos -- Saludos. Ignacio Rodríguez From marodal en gmail.com Tue Oct 15 22:44:58 2013 From: marodal en gmail.com (Miguel Angel Rodriguez) Date: Tue, 15 Oct 2013 22:44:58 +0200 Subject: [Python-es] Uso de libreria C++ en modulo con ironPython Message-ID: Hola a todos, Hola a todos, Estoy iniciándome en la programación en Python, y quiero crear un script que utilice clases creadas en Visual C#. Uso IronPython y Visual C#. Quiero probar la herencia de clases en Python. Me he creado dos clases en Python y he hecho que una herede de la otra, y que utilice sus metodos y atributos. Esto lo he conseguido sin problemas. Lo que quiero hacer a continuación es crear la misma clase en C# y que mi clase en Python herede de dicha clase. Bien, he creado un proyecto de tipo libreria en C# llamado Libreria, con un archivo ClaseBase.cs que contiene la definicion de una clase llamada ClaseBase con dos atributos enteros y un metodo que imprime una cadena. A continuación creo un script en python en la que defino una clase que herede de ClaseBase. El codigo que he puesto para importar la libreria es el siguiente: import clr import sys sys.path.Add('C:\Users\Inma\Documents\visual studio 2010\Projects\Libreria') #Direccion de mi proyecto clr.AddReference("Libreria") Cuando intento ejecutar el script con el interprete de ironPython me aparece el siguiente mensaje de error: System.IO.IOException: Could not add reference to assembly Libreria ¿Que es lo que esta pasando? ¿Por que no encuentra la dll? Gracias de antemano y un saludo a todos ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Oct 16 03:09:51 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 16 Oct 2013 03:09:51 +0200 Subject: [Python-es] Uso de libreria C++ en modulo con ironPython In-Reply-To: References: Message-ID: El día 15 de octubre de 2013 22:44, Miguel Angel Rodriguez escribió: > Hola a todos, > > Hola a todos, > > Estoy iniciándome en la programación en Python, y quiero crear un script que > utilice clases creadas en Visual C#. > > Uso IronPython y Visual C#. > > Quiero probar la herencia de clases en Python. Me he creado dos clases en > Python y he hecho que una herede de la otra, y que utilice sus metodos y > atributos. Esto lo he conseguido sin problemas. > > Lo que quiero hacer a continuación es crear la misma clase en C# y que mi > clase en Python herede de dicha clase. > > Bien, he creado un proyecto de tipo libreria en C# llamado Libreria, con un > archivo ClaseBase.cs que contiene la definicion de una clase llamada > ClaseBase con dos atributos enteros y un metodo que imprime una cadena. > > A continuación creo un script en python en la que defino una clase que > herede de ClaseBase. El codigo que he puesto para importar la libreria es el > siguiente: > > import clr > > import sys > > sys.path.Add('C:\Users\Inma\Documents\visual studio 2010\Projects\Libreria') > #Direccion de mi proyecto > > clr.AddReference("Libreria") > > Cuando intento ejecutar el script con el interprete de ironPython me aparece > el siguiente mensaje de error: > > System.IO.IOException: Could not add reference to assembly Libreria > > ¿Que es lo que esta pasando? ¿Por que no encuentra la dll? Asumo que querías escribir 'sys.path.append' en lugar de 'sys.path.Add' Cuida al poner la ruta, ya que el carácter '\' se interpreta como "escape". Si no quieres errores, o pones dos barras '\\' o, mejor, haz que sea una cadena raw: sys.path.append(r'C:\Users\Inma\Documents\visual studio 2010\Projects\Libreria') #Hay una 'r' al principio > > Gracias de antemano y un saludo a todos > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From revxfire en gmail.com Wed Oct 16 04:15:23 2013 From: revxfire en gmail.com (Victor Villalobos) Date: Wed, 16 Oct 2013 02:15:23 +0000 Subject: [Python-es] =?iso-8859-1?q?Promedios_d=EDarios_en_python?= In-Reply-To: References: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> Message-ID: Si estas usando SqLite o alguna BD con sql, también puedes sencillamente usar las operaciones SQL de sum(), count() y dividir sum / count, de las columnas que te interesan, lo digo saltándome del tema python, pero también es una opción y fácil de usar. Ejemplo: select sum(SALARIO) / count(*) as MEDIA_SALARIOS from EMPLEADOS Saludos. El 8 de octubre de 2013 10:19, Juan Luis Cano escribió: > 2013/10/8 Boris Vladimir Comi > >> Me falto aclarar que los promedios que obtengo con el codigo, usando >> numpy, son los promedios de todos los datos y yo estoy interesado en >> obtener los promedios díarios, como se puede lograr eso? >> > > > Nada más tienes que usar mean(axis=1). > > > >> ------------------------------ >> *De:* Boris Vladimir Comi >> *Enviado:* martes, 08 de octubre de 2013 02:43 a.m. >> >> *Para:* La lista de python en castellano >> *Asunto:* RE: [Python-es] Promedios díarios en python >> >> Gracias Alberto y Kiko: >> >> Si tengo instaladas las librerias de numpy y pandas. Al obtener los >> promedios, maximo y minimo de una base de datos de prueba cuya estructura >> es como sigue: >> >> Fecha, lat, lon, id, humedad,temperatura,precipitacion >> >> Para leer los datos y obtener los estadísticos lo hago de dos maneras: >> >> usando numpy: >> >> from numpy import * >> from scipy import * >> import numpy as np >> >> >> data=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=str) >> >> data1=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=int,usecols=[4,5]) >> >> print data >> >> [['2/5/04 6:45 AM' '19.7' '-95.2' '1' '45' '-38' '1'] >> ['2/5/04 7:45 AM' '19.7' '-94.7' '1' '34' '-48' '1'] >> ['2/5/04 8:45 AM' '19.3' '-93.9' '1' '57' '-60' '1'] >> ['2/5/04 9:45 AM' '19' '-93.5' '1' '89' '-58' '1'] >> ['2/5/04 10:45 AM' '19' '-92.8' '1' '34' '-50' '2'] >> ['2/5/04 11:45 AM' '19.2' '-92.6' '1' '23' '-40' '3'] >> ['2/5/04 12:45 PM' '19.9' '-93' '1' '10' '-43' '4'] >> ['2/5/04 1:15 PM' '20' '-92.8' '1' '50' '-32' '2'] >> ['30/5/04 4:45 AM' '23.1' '-100.2' '2' '45' '-45' '3'] >> ['30/5/04 5:45 AM' '23.2' '-100' '2' '68' '-56' '2'] >> ['30/5/04 6:45 AM' '23.3' '-100' '2' '90' '-48' '1'] >> ['30/5/04 7:45 AM' '23.3' '-100.2' '2' '100' '-32' '1'] >> ['31/5/04 3:15 AM' '23.4' '-99' '3' '12' '-36' '1'] >> ['31/5/04 4:15 AM' '23.5' '-98.9' '3' '34' '-46' '1'] >> ['31/5/04 5:15 AM' '23.6' '-98.7' '3' '56' '-68' '2'] >> ['31/5/04 6:15 AM' '23.7' '-98.8' '3' '78' '-30' '1']] >> >> print 'mean:', data1.mean(axis=0) >> print 'max:', data1.max(axis=0) >> print 'min:', data1.min(axis=0) >> >> mean: [ 51.5625 -45.625 ] >> max: [100 -30] >> min: [ 10 -68] >> >> la pregunta es: como obtengo la suma unicamente de la columna >> precipitacion? >> >> Usando pandas: >> >> import pandas as pd >> >> df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) >> df >> >> Lat Lon ID Moisture Temperature Precipitacion >> >> Date >> 2004-02-05 06:45:00 19.7 -95.2 1 45 -38 1 >> 2004-02-05 07:45:00 19.7 -94.7 1 34 -48 1 >> 2004-02-05 08:45:00 19.3 -93.9 1 57 -60 1 >> 2004-02-05 09:45:00 19.0 -93.5 1 89 -58 1 >> 2004-02-05 10:45:00 19.0 -92.8 1 34 -50 2 >> 2004-02-05 11:45:00 19.2 -92.6 1 23 -40 3 >> 2004-02-05 12:45:00 19.9 -93.0 1 10 -43 4 >> 2004-02-05 13:15:00 20.0 -92.8 1 50 -32 2 >> 2004-05-30 04:45:00 23.1 -100.2 2 45 -45 3 >> >> 2004-05-30 05:45:00 23.2 -100.0 2 68 -56 2 >> 2004-05-30 06:45:00 23.3 -100.0 2 90 -48 1 >> 2004-05-30 07:45:00 23.3 -100.2 2 100 -32 1 >> 2004-05-31 03:15:00 23.4 -99.0 3 12 -36 1 >> 2004-05-31 04:15:00 23.5 -98.9 3 34 -46 1 >> 2004-05-31 05:15:00 23.6 -98.7 3 56 -68 2 >> 2004-05-31 06:15:00 23.7 -98.8 3 78 -30 1 >> >> >> Al intentar conseguir, por ejmplo la suma diaria: >> >> df.resample('D',how='sum') >> >> obtengo lo siguiente: >> >> Lat Lon ID Moisture Temperature >> >> Date >> 2004-02-06 155.8 -748.5 8 342 -369 >> 2004-02-07 NaN NaN NaN NaN NaN >> 2004-02-08 NaN NaN NaN NaN NaN >> 2004-02-09 NaN NaN NaN NaN NaN >> 2004-02-10 NaN NaN NaN NaN NaN >> 2004-02-11 NaN NaN NaN NaN NaN >> 2004-02-12 NaN NaN NaN NaN NaN >> 2004-02-13 NaN NaN NaN NaN NaN >> 2004-02-14 NaN NaN NaN NaN NaN >> 2004-02-15 NaN NaN NaN NaN NaN >> 2004-02-16 NaN NaN NaN NaN NaN >> 2004-02-17 NaN NaN NaN NaN NaN >> 2004-02-18 NaN NaN NaN NaN NaN >> 2004-02-19 NaN NaN NaN NaN NaN >> 2004-02-20 NaN NaN NaN NaN NaN >> 2004-02-21 NaN NaN NaN NaN NaN >> 2004-02-22 NaN NaN NaN NaN NaN >> 2004-02-23 NaN NaN NaN NaN NaN >> 2004-02-24 NaN NaN NaN NaN NaN >> 2004-02-25 NaN NaN NaN NaN NaN >> 2004-02-26 NaN NaN NaN NaN NaN >> 2004-02-27 NaN NaN NaN NaN NaN >> 2004-02-28 NaN NaN NaN NaN NaN >> 2004-02-29 NaN NaN NaN NaN NaN >> 2004-03-01 NaN NaN NaN NaN NaN >> 2004-03-02 NaN NaN NaN NaN NaN >> 2004-03-03 NaN NaN NaN NaN NaN >> 2004-03-04 NaN NaN NaN NaN NaN >> 2004-03-05 NaN NaN NaN NaN NaN >> 2004-03-06 NaN NaN NaN NaN NaN >> 2004-03-07 NaN NaN NaN NaN NaN >> 2004-03-08 NaN NaN NaN NaN NaN >> 2004-03-09 NaN NaN NaN NaN NaN >> 2004-03-10 NaN NaN NaN NaN NaN >> 2004-03-11 NaN NaN NaN NaN NaN >> 2004-03-12 NaN NaN NaN NaN NaN >> 2004-03-13 NaN NaN NaN NaN NaN >> 2004-03-14 NaN NaN NaN NaN NaN >> 2004-03-15 NaN NaN NaN NaN NaN >> 2004-03-16 NaN NaN NaN NaN NaN >> 2004-03-17 NaN NaN NaN NaN NaN >> 2004-03-18 NaN NaN NaN NaN NaN >> 2004-03-19 NaN NaN NaN NaN NaN >> 2004-03-20 NaN NaN NaN NaN NaN >> 2004-03-21 NaN NaN NaN NaN NaN >> 2004-03-22 NaN NaN NaN NaN NaN >> 2004-03-23 NaN NaN NaN NaN NaN >> 2004-03-24 NaN NaN NaN NaN NaN >> 2004-03-25 NaN NaN NaN NaN NaN >> 2004-03-26 NaN NaN NaN NaN NaN >> 2004-03-27 NaN NaN NaN NaN NaN >> 2004-03-28 NaN NaN NaN NaN NaN >> 2004-03-29 NaN NaN NaN NaN NaN >> 2004-03-30 NaN NaN NaN NaN NaN >> 2004-03-31 NaN NaN NaN NaN NaN >> 2004-04-01 NaN NaN NaN NaN NaN >> 2004-04-02 NaN NaN NaN NaN NaN >> 2004-04-03 NaN NaN NaN NaN NaN >> 2004-04-04 NaN NaN NaN NaN NaN >> 2004-04-05 NaN NaN NaN NaN NaN >> 2004-04-06 NaN NaN NaN NaN NaN >> 2004-04-07 NaN NaN NaN NaN NaN >> 2004-04-08 NaN NaN NaN NaN NaN >> 2004-04-09 NaN NaN NaN NaN NaN >> 2004-04-10 NaN NaN NaN NaN NaN >> 2004-04-11 NaN NaN NaN NaN NaN >> 2004-04-12 NaN NaN NaN NaN NaN >> 2004-04-13 NaN NaN NaN NaN NaN >> 2004-04-14 NaN NaN NaN NaN NaN >> 2004-04-15 NaN NaN NaN NaN NaN >> 2004-04-16 NaN NaN NaN NaN NaN >> 2004-04-17 NaN NaN NaN NaN NaN >> 2004-04-18 NaN NaN NaN NaN NaN >> 2004-04-19 NaN NaN NaN NaN NaN >> 2004-04-20 NaN NaN NaN NaN NaN >> 2004-04-21 NaN NaN NaN NaN NaN >> 2004-04-22 NaN NaN NaN NaN NaN >> 2004-04-23 NaN NaN NaN NaN NaN >> 2004-04-24 NaN NaN NaN NaN NaN >> 2004-04-25 NaN NaN NaN NaN NaN >> 2004-04-26 NaN NaN NaN NaN NaN >> 2004-04-27 NaN NaN NaN NaN NaN >> 2004-04-28 NaN NaN NaN NaN NaN >> 2004-04-29 NaN NaN NaN NaN NaN >> 2004-04-30 NaN NaN NaN NaN NaN >> 2004-05-01 NaN NaN NaN NaN NaN >> 2004-05-02 NaN NaN NaN NaN NaN >> 2004-05-03 NaN NaN NaN NaN NaN >> 2004-05-04 NaN NaN NaN NaN NaN >> 2004-05-05 NaN NaN NaN NaN NaN >> 2004-05-06 NaN NaN NaN NaN NaN >> 2004-05-07 NaN NaN NaN NaN NaN >> 2004-05-08 NaN NaN NaN NaN NaN >> 2004-05-09 NaN NaN NaN NaN NaN >> 2004-05-10 NaN NaN NaN NaN NaN >> 2004-05-11 NaN NaN NaN NaN NaN >> 2004-05-12 NaN NaN NaN NaN NaN >> 2004-05-13 NaN NaN NaN NaN NaN >> 2004-05-14 NaN NaN NaN NaN NaN >> 2004-05-15 NaN NaN NaN NaN NaN >> 2004-05-16 NaN NaN NaN NaN NaN >> 2004-05-17 NaN NaN NaN NaN NaN >> 2004-05-18 NaN NaN NaN NaN NaN >> 2004-05-19 NaN NaN NaN NaN NaN >> 2004-05-20 NaN NaN NaN NaN NaN >> 2004-05-21 NaN NaN NaN NaN NaN >> 2004-05-22 NaN NaN NaN NaN NaN >> 2004-05-23 NaN NaN NaN NaN NaN >> 2004-05-24 NaN NaN NaN NaN NaN >> 2004-05-25 NaN NaN NaN NaN NaN >> 2004-05-26 NaN NaN NaN NaN NaN >> 2004-05-27 NaN NaN NaN NaN NaN >> 2004-05-28 NaN NaN NaN NaN NaN >> 2004-05-29 NaN NaN NaN NaN NaN >> 2004-05-30 NaN NaN NaN NaN NaN >> 2004-05-31 92.9 -400.4 8 303 -181 5 >> 2004-06-01 94.2 -395.4 12 180 -180 >> >> Hice algo mal, porque no toma en cuenta la fecha correspondiente al >> 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? >> >> >> Agradeceria su ayuda >> >> >> ------------------------------ >> *De:* Python-es >> en nombre de Alberto Chamorro >> *Enviado:* martes, 08 de octubre de 2013 01:06 a.m. >> *Para:* La lista de python en castellano >> *Asunto:* Re: [Python-es] Promedios díarios en python >> >> >> Y la pregunta sobre Python es.... >> >> ¿Tienes algún algoritmo que hayas intentado hacer al menos? >> >> Alberto >> >> Tengo datos mensuales estructurados en la siguiente manera >> >> Fecha,Time, Humedad, Temperatura, Precipitación Acumulada >> 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, >> . >> . >> . >> .1/01/2011, 23:45, 22, 40, 0, >> . >> . >> . >> .31/01/2011, 00:00, 23, 45, 0, >> >> Como puedo conseguir los promedios díarios de las variables Temperatura y >> Humedad así como la suma díaria de la Precipitacion Acumulada? >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Juanlu > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Victor Villalobos Bahia Pirata Inversiones Villalobos Balzan. 0412 6882141 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From hfoffani en gmail.com Wed Oct 16 11:16:12 2013 From: hfoffani en gmail.com (=?iso-8859-1?Q?Hern=E1n_Foffani?=) Date: Wed, 16 Oct 2013 11:16:12 +0200 Subject: [Python-es] Uso de libreria C++ en modulo con ironPython In-Reply-To: References: Message-ID: <53C7ABEC-BACE-4EBE-86C7-58B4227693F2@gmail.com> >> A continuación creo un script en python en la que defino una clase que >> herede de ClaseBase. El codigo que he puesto para importar la libreria es el >> siguiente: >> >> import clr >> >> import sys >> >> sys.path.Add('C:\Users\Inma\Documents\visual studio 2010\Projects\Libreria') >> #Direccion de mi proyecto >> >> clr.AddReference("Libreria") >> >> Cuando intento ejecutar el script con el interprete de ironPython me aparece >> el siguiente mensaje de error: >> >> System.IO.IOException: Could not add reference to assembly Libreria >> >> ¿Que es lo que esta pasando? ¿Por que no encuentra la dll? > > Asumo que querías escribir 'sys.path.append' en lugar de 'sys.path.Add' > > Cuida al poner la ruta, ya que el carácter '\' se interpreta como > "escape". Si no quieres errores, o pones dos barras '\\' o, mejor, haz > que sea una cadena raw: > > sys.path.append(r'C:\Users\Inma\Documents\visual studio 2010\Projects\Libreria') #Hay una 'r' al principio En realidad en IronPython una vez importada la biblioteca clr sys.path se comporta como una lista de Python y .NET así que debería ser lo mismo. En vez de AddReference usa directamente AddReferenceToFileAndPath (no toques sys.path) y sige la sugerencia de Chema de pasar el parámetro como cadena raw. -Hernán. From carlos.zun en gmail.com Thu Oct 17 00:47:20 2013 From: carlos.zun en gmail.com (Carlos Zuniga) Date: Wed, 16 Oct 2013 17:47:20 -0500 Subject: [Python-es] =?utf-8?q?Lista_de_libros_de_programaci=C3=B3n_libres?= =?utf-8?q?/gratuitos?= Message-ID: Siempre hay quienes vienen a la lista buscando libros para leer online o descargar, aquí hay una recopilación de todos ellos: https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python Si conocen otros, no duden en mandar su pull-request ;) Saludos -- A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos de leer manuales. From chack14rock en gmail.com Thu Oct 17 01:00:51 2013 From: chack14rock en gmail.com (=?ISO-8859-1?Q?Charly_Rom=E1n?=) Date: Wed, 16 Oct 2013 18:00:51 -0500 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: Yo inicié una lista en español: https://github.com/Carlangueitor/libros-programacion El día 16 de octubre de 2013 17:47, Carlos Zuniga escribió: > Siempre hay quienes vienen a la lista buscando libros para leer online > o descargar, aquí hay una recopilación de todos ellos: > > https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > > Si conocen otros, no duden en mandar su pull-request ;) > > > Saludos > -- > A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos > de leer manuales. > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From nikodis en gmail.com Thu Oct 17 01:08:44 2013 From: nikodis en gmail.com (=?ISO-8859-1?Q?Nicol=E1s_Disquin?=) Date: Wed, 16 Oct 2013 18:38:44 -0430 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= Message-ID: Lo malo que todos están en inglés, si me cuesta entender python y gambas en español imaginate en inglés. Ya se que en su mayoría en informática es en inglés, creo que deberían sacar más información en otros idiomas. Y no es el inglés el problema, el problema es que si cuesta entender un concepto medio avanzado de programación en español imaginate en otro idioma. No creo que sea justo para los que hablan o portugués o francés o chino o español y asi Carlos Zuniga escribió: >Siempre hay quienes vienen a la lista buscando libros para leer online >o descargar, aquí hay una recopilación de todos ellos: > >https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > >Si conocen otros, no duden en mandar su pull-request ;) > > >Saludos >-- >A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos >de leer manuales. >_______________________________________________ >Python-es mailing list >Python-es en python.org >https://mail.python.org/mailman/listinfo/python-es >FAQ: http://python-es-faq.wikidot.com/ From francois.dion en gmail.com Thu Oct 17 03:47:54 2013 From: francois.dion en gmail.com (Francois Dion) Date: Wed, 16 Oct 2013 21:47:54 -0400 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: Empece una lista tambien el ano pasado: http://raspberry-python.blogspot.com/2012/12/libros-python-en-espanol.html Pero la lista de Charly es algo muy bueno. Voy a anadir un enlace en mi blog. Francois -- www.pyptug.org - raspberry-python.blogspot.com - @f_dion 2013/10/16 Nicolás Disquin > Lo malo que todos están en inglés, si me cuesta entender python y gambas > en español imaginate en inglés. > Ya se que en su mayoría en informática es en inglés, creo que deberían > sacar más información en otros idiomas. Y no es el inglés el problema, el > problema es que si cuesta entender un concepto medio avanzado de > programación en español imaginate en otro idioma. No creo que sea justo > para los que hablan o portugués o francés o chino o español y asi > > Carlos Zuniga escribió: > > >Siempre hay quienes vienen a la lista buscando libros para leer online > >o descargar, aquí hay una recopilación de todos ellos: > > > > > https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > > > >Si conocen otros, no duden en mandar su pull-request ;) > > > > > >Saludos > >-- > >A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos > >de leer manuales. > >_______________________________________________ > >Python-es mailing list > >Python-es en python.org > >https://mail.python.org/mailman/listinfo/python-es > >FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jbc.develop en gmail.com Thu Oct 17 03:55:05 2013 From: jbc.develop en gmail.com (Juan BC) Date: Wed, 16 Oct 2013 22:55:05 -0300 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: gracias a dios guido no hizo un lenguaje en holandés, ni linux esta en finlandés, ni ruby en japones, ni php en noruego, ni lua en portugués, ni cherokee en español, ni.... no estoy en contra de mi lengua materna, pero en ciencia y tecnologia la lingua franca es el ingles. en cierta forma adentrarnos en la informatica es asumir el ingles como forma de comunicarse El 16/10/2013 22:08, "Nicolás Disquin" escribió: > Lo malo que todos están en inglés, si me cuesta entender python y gambas > en español imaginate en inglés. > Ya se que en su mayoría en informática es en inglés, creo que deberían > sacar más información en otros idiomas. Y no es el inglés el problema, el > problema es que si cuesta entender un concepto medio avanzado de > programación en español imaginate en otro idioma. No creo que sea justo > para los que hablan o portugués o francés o chino o español y asi > > Carlos Zuniga escribió: > > >Siempre hay quienes vienen a la lista buscando libros para leer online > >o descargar, aquí hay una recopilación de todos ellos: > > > > > https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > > > >Si conocen otros, no duden en mandar su pull-request ;) > > > > > >Saludos > >-- > >A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos > >de leer manuales. > >_______________________________________________ > >Python-es mailing list > >Python-es en python.org > >https://mail.python.org/mailman/listinfo/python-es > >FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jza en oooes.org Thu Oct 17 04:01:10 2013 From: jza en oooes.org (Alexandro Colorado) Date: Wed, 16 Oct 2013 21:01:10 -0500 Subject: [Python-es] =?utf-8?q?Lista_de_libros_de_programaci=C3=B3n_libres?= =?utf-8?q?/gratuitos?= In-Reply-To: References: Message-ID: De hecho lo realmente malo es que TU no sabes ingles. 2013/10/16 Nicolás Disquin > Lo malo que todos están en inglés, si me cuesta entender python y gambas > en español imaginate en inglés. > Ya se que en su mayoría en informática es en inglés, creo que deberían > sacar más información en otros idiomas. Y no es el inglés el problema, el > problema es que si cuesta entender un concepto medio avanzado de > programación en español imaginate en otro idioma. No creo que sea justo > para los que hablan o portugués o francés o chino o español y asi > > Carlos Zuniga escribió: > > >Siempre hay quienes vienen a la lista buscando libros para leer online > >o descargar, aquí hay una recopilación de todos ellos: > > > > > https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > > > >Si conocen otros, no duden en mandar su pull-request ;) > > > > > >Saludos > >-- > >A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos > >de leer manuales. > >_______________________________________________ > >Python-es mailing list > >Python-es en python.org > >https://mail.python.org/mailman/listinfo/python-es > >FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Alexandro Colorado Apache OpenOffice Contributor http://www.openoffice.org 882C 4389 3C27 E8DF 41B9 5C4C 1DB7 9D1C 7F4C 2614 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From monobot.soft en gmail.com Thu Oct 17 16:01:37 2013 From: monobot.soft en gmail.com (monoBOT) Date: Thu, 17 Oct 2013 15:01:37 +0100 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: El 17 de octubre de 2013 03:01, Alexandro Colorado escribió: > De hecho lo realmente malo es que TU no sabes ingles. es una forma un poco burra de decirlo, lo cierto es que no solo debe siempre ser el primer paso si quieres aprender programación. -- *monoBOT* Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From bertothunder en gmail.com Fri Oct 18 09:30:11 2013 From: bertothunder en gmail.com (Alberto Curro) Date: Fri, 18 Oct 2013 08:30:11 +0100 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> Message-ID: Hola, 2013/10/13 Andres Vargas - zodman > usa relatorio! > Aunque relatorio es un proyecto interesante, no es lo que Ramiro pregunta originalmente. Desde mi experiencia, creo que lo tienes complicado a priori, pero no imposible. Hasta donde yo sé, (no puedo hablar por GTK, yo desarrollo/desarrollaba en KDE), cosas como el KParts permitían el embebido de objetos y partes, pero OpenOffice no lo soporta (intentad copiar una tabla de OpenOffice fuera de OoO y lo comprobáis por vosotros mismos). GTK seguro que tiene algo parecido, pero estarás en la misma tesitura. Alguna experiencia tengo también con OLE, y te puedo asegurar que desde luego la idea en Windows no te lo aconsejaría "ni jarto vino", por la cantidad de pitfalls y problemas secundarios que vas a encontrate (además del consumo de memoria, dado que realmente tendrías una instancia de OoO corriendo en background con su espacio de memoria, más el espacio de memoria e intercambio OLE, más tu aplicación). La idea de Alexandro parece interesante, e imagino que en GTK tendrás controles grid de calidad, sólo tendrías que desarrollar el método de intercambio de datos. En StackOverflow hay también una pregunta parecida, para MacOSX, échale un vistazo a la respuesta "aprobada", también podría darte ideas: http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application Ya contarás. Saludos Alberto > > El 12 de octubre de 2013 23:07, Alexandro Coloradoescribió: > > Es un reto interesante, tu puedes controlar OpenOffice remotamente via >> python, y OpenOffice puede funcionar como un servicio. Sin embargo no >> se eso de 'embedir' el workspace de Calc dentro de una ventana en GTK. >> >> Quizas, por su cercania al framework tengas mejor suerte usando >> Gnumerics. O puedes usar calc como servicio y hacer el intercambio de >> datos. Algo similar a lo que se hizo con Java/Javascript en esta >> aplicacion: >> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >> >> On 10/12/13, Ramiro wrote: >> > Hola >> > >> > >> > ¿Es posible ver una planilla de cálculo de OpenOffice como si >> > fuera un control de formulario más en pyGTK?, (al estilo OLE2 de >> windows) >> > >> > >> > >> > >> > >> > >> > saludos >> > >> > Ramiro >> > _______________________________________________ >> > Python-es mailing list >> > Python-es en python.org >> > https://mail.python.org/mailman/listinfo/python-es >> > FAQ: http://python-es-faq.wikidot.com/ >> > >> >> >> -- >> Alexandro Colorado >> Apache OpenOffice Contributor >> http://www.openoffice.org >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> > > > > -- > Andres Vargas > www.zodman.com.mx > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From bertothunder en gmail.com Fri Oct 18 09:36:33 2013 From: bertothunder en gmail.com (Alberto Curro) Date: Fri, 18 Oct 2013 08:36:33 +0100 Subject: [Python-es] =?utf-8?q?Promedios_d=C3=ADarios_en_python?= In-Reply-To: References: <8a9124e029044d269d72768136407f32@BLUPR07MB307.namprd07.prod.outlook.com> Message-ID: Hola, El 16 de octubre de 2013 03:15, Victor Villalobos escribió: > Si estas usando SqLite o alguna BD con sql, también puedes sencillamente > usar las operaciones SQL de sum(), count() y dividir sum / count, de las > columnas que te interesan, lo digo saltándome del tema python, pero también > es una opción y fácil de usar. > En este mismo problema, es lo que yo hago. Tengo cientos de CSVs generados desde logs de distintas aplicaciones, y los inserto primero en una base de datos SQLite con una pequeña aplicación python (5 segundos para 1 millón de registros, aprox. 120Mb de base de datos SQLite). Una segunda aplicación abre después la base de datos SQLite, y arranca las consultas y guarda los resultados; por motivos técnicos, tengo que controlar el uso de CPU, por lo que todas estas aplicaciones se corren como trabajos cron, cada una muy pequeña y de uso de CPU intenso pero muy, muy corto. Una tercera aplicación recoge los resultados, genera informes (PDF, otros CSV), etc. Por último un cuarto trabajo cron comprime la base de datos SQLite y la guarda en un repositorio de backup, donde estará unos días (por si se necesita consultar esos datos de nuevo). Saludos Alberto > Ejemplo: > select sum(SALARIO) / count(*) as MEDIA_SALARIOS > from EMPLEADOS > > Saludos. > > > El 8 de octubre de 2013 10:19, Juan Luis Cano escribió: > > 2013/10/8 Boris Vladimir Comi >> >>> Me falto aclarar que los promedios que obtengo con el codigo, usando >>> numpy, son los promedios de todos los datos y yo estoy interesado en >>> obtener los promedios díarios, como se puede lograr eso? >>> >> >> >> Nada más tienes que usar mean(axis=1). >> >> >> >>> ------------------------------ >>> *De:* Boris Vladimir Comi >>> *Enviado:* martes, 08 de octubre de 2013 02:43 a.m. >>> >>> *Para:* La lista de python en castellano >>> *Asunto:* RE: [Python-es] Promedios díarios en python >>> >>> Gracias Alberto y Kiko: >>> >>> Si tengo instaladas las librerias de numpy y pandas. Al obtener los >>> promedios, maximo y minimo de una base de datos de prueba cuya estructura >>> es como sigue: >>> >>> Fecha, lat, lon, id, humedad,temperatura,precipitacion >>> >>> Para leer los datos y obtener los estadísticos lo hago de dos maneras: >>> >>> usando numpy: >>> >>> from numpy import * >>> from scipy import * >>> import numpy as np >>> >>> >>> data=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=str) >>> >>> data1=np.loadtxt('path-tracks.csv',delimiter=',',skiprows=1,dtype=int,usecols=[4,5]) >>> >>> print data >>> >>> [['2/5/04 6:45 AM' '19.7' '-95.2' '1' '45' '-38' '1'] >>> ['2/5/04 7:45 AM' '19.7' '-94.7' '1' '34' '-48' '1'] >>> ['2/5/04 8:45 AM' '19.3' '-93.9' '1' '57' '-60' '1'] >>> ['2/5/04 9:45 AM' '19' '-93.5' '1' '89' '-58' '1'] >>> ['2/5/04 10:45 AM' '19' '-92.8' '1' '34' '-50' '2'] >>> ['2/5/04 11:45 AM' '19.2' '-92.6' '1' '23' '-40' '3'] >>> ['2/5/04 12:45 PM' '19.9' '-93' '1' '10' '-43' '4'] >>> ['2/5/04 1:15 PM' '20' '-92.8' '1' '50' '-32' '2'] >>> ['30/5/04 4:45 AM' '23.1' '-100.2' '2' '45' '-45' '3'] >>> ['30/5/04 5:45 AM' '23.2' '-100' '2' '68' '-56' '2'] >>> ['30/5/04 6:45 AM' '23.3' '-100' '2' '90' '-48' '1'] >>> ['30/5/04 7:45 AM' '23.3' '-100.2' '2' '100' '-32' '1'] >>> ['31/5/04 3:15 AM' '23.4' '-99' '3' '12' '-36' '1'] >>> ['31/5/04 4:15 AM' '23.5' '-98.9' '3' '34' '-46' '1'] >>> ['31/5/04 5:15 AM' '23.6' '-98.7' '3' '56' '-68' '2'] >>> ['31/5/04 6:15 AM' '23.7' '-98.8' '3' '78' '-30' '1']] >>> >>> print 'mean:', data1.mean(axis=0) >>> print 'max:', data1.max(axis=0) >>> print 'min:', data1.min(axis=0) >>> >>> mean: [ 51.5625 -45.625 ] >>> max: [100 -30] >>> min: [ 10 -68] >>> >>> la pregunta es: como obtengo la suma unicamente de la columna >>> precipitacion? >>> >>> Usando pandas: >>> >>> import pandas as pd >>> >>> df = pd.read_csv('path-tracks.csv', index_col= 'Date', parse_dates=[0]) >>> df >>> >>> Lat Lon ID Moisture Temperature Precipitacion >>> >>> Date >>> 2004-02-05 06:45:00 19.7 -95.2 1 45 -38 1 >>> 2004-02-05 07:45:00 19.7 -94.7 1 34 -48 1 >>> 2004-02-05 08:45:00 19.3 -93.9 1 57 -60 1 >>> 2004-02-05 09:45:00 19.0 -93.5 1 89 -58 1 >>> 2004-02-05 10:45:00 19.0 -92.8 1 34 -50 2 >>> 2004-02-05 11:45:00 19.2 -92.6 1 23 -40 3 >>> 2004-02-05 12:45:00 19.9 -93.0 1 10 -43 4 >>> 2004-02-05 13:15:00 20.0 -92.8 1 50 -32 2 >>> 2004-05-30 04:45:00 23.1 -100.2 2 45 -45 3 >>> >>> 2004-05-30 05:45:00 23.2 -100.0 2 68 -56 2 >>> 2004-05-30 06:45:00 23.3 -100.0 2 90 -48 1 >>> 2004-05-30 07:45:00 23.3 -100.2 2 100 -32 1 >>> 2004-05-31 03:15:00 23.4 -99.0 3 12 -36 1 >>> 2004-05-31 04:15:00 23.5 -98.9 3 34 -46 1 >>> 2004-05-31 05:15:00 23.6 -98.7 3 56 -68 2 >>> 2004-05-31 06:15:00 23.7 -98.8 3 78 -30 1 >>> >>> >>> Al intentar conseguir, por ejmplo la suma diaria: >>> >>> df.resample('D',how='sum') >>> >>> obtengo lo siguiente: >>> >>> Lat Lon ID Moisture Temperature >>> >>> Date >>> 2004-02-06 155.8 -748.5 8 342 -369 >>> 2004-02-07 NaN NaN NaN NaN NaN >>> 2004-02-08 NaN NaN NaN NaN NaN >>> 2004-02-09 NaN NaN NaN NaN NaN >>> 2004-02-10 NaN NaN NaN NaN NaN >>> 2004-02-11 NaN NaN NaN NaN NaN >>> 2004-02-12 NaN NaN NaN NaN NaN >>> 2004-02-13 NaN NaN NaN NaN NaN >>> 2004-02-14 NaN NaN NaN NaN NaN >>> 2004-02-15 NaN NaN NaN NaN NaN >>> 2004-02-16 NaN NaN NaN NaN NaN >>> 2004-02-17 NaN NaN NaN NaN NaN >>> 2004-02-18 NaN NaN NaN NaN NaN >>> 2004-02-19 NaN NaN NaN NaN NaN >>> 2004-02-20 NaN NaN NaN NaN NaN >>> 2004-02-21 NaN NaN NaN NaN NaN >>> 2004-02-22 NaN NaN NaN NaN NaN >>> 2004-02-23 NaN NaN NaN NaN NaN >>> 2004-02-24 NaN NaN NaN NaN NaN >>> 2004-02-25 NaN NaN NaN NaN NaN >>> 2004-02-26 NaN NaN NaN NaN NaN >>> 2004-02-27 NaN NaN NaN NaN NaN >>> 2004-02-28 NaN NaN NaN NaN NaN >>> 2004-02-29 NaN NaN NaN NaN NaN >>> 2004-03-01 NaN NaN NaN NaN NaN >>> 2004-03-02 NaN NaN NaN NaN NaN >>> 2004-03-03 NaN NaN NaN NaN NaN >>> 2004-03-04 NaN NaN NaN NaN NaN >>> 2004-03-05 NaN NaN NaN NaN NaN >>> 2004-03-06 NaN NaN NaN NaN NaN >>> 2004-03-07 NaN NaN NaN NaN NaN >>> 2004-03-08 NaN NaN NaN NaN NaN >>> 2004-03-09 NaN NaN NaN NaN NaN >>> 2004-03-10 NaN NaN NaN NaN NaN >>> 2004-03-11 NaN NaN NaN NaN NaN >>> 2004-03-12 NaN NaN NaN NaN NaN >>> 2004-03-13 NaN NaN NaN NaN NaN >>> 2004-03-14 NaN NaN NaN NaN NaN >>> 2004-03-15 NaN NaN NaN NaN NaN >>> 2004-03-16 NaN NaN NaN NaN NaN >>> 2004-03-17 NaN NaN NaN NaN NaN >>> 2004-03-18 NaN NaN NaN NaN NaN >>> 2004-03-19 NaN NaN NaN NaN NaN >>> 2004-03-20 NaN NaN NaN NaN NaN >>> 2004-03-21 NaN NaN NaN NaN NaN >>> 2004-03-22 NaN NaN NaN NaN NaN >>> 2004-03-23 NaN NaN NaN NaN NaN >>> 2004-03-24 NaN NaN NaN NaN NaN >>> 2004-03-25 NaN NaN NaN NaN NaN >>> 2004-03-26 NaN NaN NaN NaN NaN >>> 2004-03-27 NaN NaN NaN NaN NaN >>> 2004-03-28 NaN NaN NaN NaN NaN >>> 2004-03-29 NaN NaN NaN NaN NaN >>> 2004-03-30 NaN NaN NaN NaN NaN >>> 2004-03-31 NaN NaN NaN NaN NaN >>> 2004-04-01 NaN NaN NaN NaN NaN >>> 2004-04-02 NaN NaN NaN NaN NaN >>> 2004-04-03 NaN NaN NaN NaN NaN >>> 2004-04-04 NaN NaN NaN NaN NaN >>> 2004-04-05 NaN NaN NaN NaN NaN >>> 2004-04-06 NaN NaN NaN NaN NaN >>> 2004-04-07 NaN NaN NaN NaN NaN >>> 2004-04-08 NaN NaN NaN NaN NaN >>> 2004-04-09 NaN NaN NaN NaN NaN >>> 2004-04-10 NaN NaN NaN NaN NaN >>> 2004-04-11 NaN NaN NaN NaN NaN >>> 2004-04-12 NaN NaN NaN NaN NaN >>> 2004-04-13 NaN NaN NaN NaN NaN >>> 2004-04-14 NaN NaN NaN NaN NaN >>> 2004-04-15 NaN NaN NaN NaN NaN >>> 2004-04-16 NaN NaN NaN NaN NaN >>> 2004-04-17 NaN NaN NaN NaN NaN >>> 2004-04-18 NaN NaN NaN NaN NaN >>> 2004-04-19 NaN NaN NaN NaN NaN >>> 2004-04-20 NaN NaN NaN NaN NaN >>> 2004-04-21 NaN NaN NaN NaN NaN >>> 2004-04-22 NaN NaN NaN NaN NaN >>> 2004-04-23 NaN NaN NaN NaN NaN >>> 2004-04-24 NaN NaN NaN NaN NaN >>> 2004-04-25 NaN NaN NaN NaN NaN >>> 2004-04-26 NaN NaN NaN NaN NaN >>> 2004-04-27 NaN NaN NaN NaN NaN >>> 2004-04-28 NaN NaN NaN NaN NaN >>> 2004-04-29 NaN NaN NaN NaN NaN >>> 2004-04-30 NaN NaN NaN NaN NaN >>> 2004-05-01 NaN NaN NaN NaN NaN >>> 2004-05-02 NaN NaN NaN NaN NaN >>> 2004-05-03 NaN NaN NaN NaN NaN >>> 2004-05-04 NaN NaN NaN NaN NaN >>> 2004-05-05 NaN NaN NaN NaN NaN >>> 2004-05-06 NaN NaN NaN NaN NaN >>> 2004-05-07 NaN NaN NaN NaN NaN >>> 2004-05-08 NaN NaN NaN NaN NaN >>> 2004-05-09 NaN NaN NaN NaN NaN >>> 2004-05-10 NaN NaN NaN NaN NaN >>> 2004-05-11 NaN NaN NaN NaN NaN >>> 2004-05-12 NaN NaN NaN NaN NaN >>> 2004-05-13 NaN NaN NaN NaN NaN >>> 2004-05-14 NaN NaN NaN NaN NaN >>> 2004-05-15 NaN NaN NaN NaN NaN >>> 2004-05-16 NaN NaN NaN NaN NaN >>> 2004-05-17 NaN NaN NaN NaN NaN >>> 2004-05-18 NaN NaN NaN NaN NaN >>> 2004-05-19 NaN NaN NaN NaN NaN >>> 2004-05-20 NaN NaN NaN NaN NaN >>> 2004-05-21 NaN NaN NaN NaN NaN >>> 2004-05-22 NaN NaN NaN NaN NaN >>> 2004-05-23 NaN NaN NaN NaN NaN >>> 2004-05-24 NaN NaN NaN NaN NaN >>> 2004-05-25 NaN NaN NaN NaN NaN >>> 2004-05-26 NaN NaN NaN NaN NaN >>> 2004-05-27 NaN NaN NaN NaN NaN >>> 2004-05-28 NaN NaN NaN NaN NaN >>> 2004-05-29 NaN NaN NaN NaN NaN >>> 2004-05-30 NaN NaN NaN NaN NaN >>> 2004-05-31 92.9 -400.4 8 303 -181 5 >>> 2004-06-01 94.2 -395.4 12 180 -180 >>> >>> Hice algo mal, porque no toma en cuenta la fecha correspondiente al >>> 2004-02-05 6:45:00, 2004-30-05 6:45:00? como solucionar este error? >>> >>> >>> Agradeceria su ayuda >>> >>> >>> ------------------------------ >>> *De:* Python-es >>> en nombre de Alberto Chamorro >>> *Enviado:* martes, 08 de octubre de 2013 01:06 a.m. >>> *Para:* La lista de python en castellano >>> *Asunto:* Re: [Python-es] Promedios díarios en python >>> >>> >>> Y la pregunta sobre Python es.... >>> >>> ¿Tienes algún algoritmo que hayas intentado hacer al menos? >>> >>> Alberto >>> >>> Tengo datos mensuales estructurados en la siguiente manera >>> >>> Fecha,Time, Humedad, Temperatura, Precipitación Acumulada >>> 1/01/2011, 00:00, 23, 50, 2, 1/01/2011, 00:15, 22, 45, 1, 1/01/2011, 00:30, 20, 39, 0, 1/01/2011, 01:00, 25, 34, 0, 1/01/2011, 01:15, 23, 50, 0, >>> . >>> . >>> . >>> .1/01/2011, 23:45, 22, 40, 0, >>> . >>> . >>> . >>> .31/01/2011, 00:00, 23, 45, 0, >>> >>> Como puedo conseguir los promedios díarios de las variables Temperatura >>> y Humedad así como la suma díaria de la Precipitacion Acumulada? >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >> >> >> -- >> Juanlu >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Victor Villalobos > Bahia Pirata > Inversiones Villalobos Balzan. > 0412 6882141 > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From bertothunder en gmail.com Fri Oct 18 09:48:40 2013 From: bertothunder en gmail.com (Alberto Curro) Date: Fri, 18 Oct 2013 08:48:40 +0100 Subject: [Python-es] OT- Necesito un colaborador In-Reply-To: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> References: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> Message-ID: Perdón por la respuesta off-topic, pero es que tu correo me ha recordado varias frases que un compañero mío decía continuamente, como que "cuando dices que tienes el 95% de la aplicación hecha, el 5% restante te llevará el 95% del tiempo". Sólo viendo algunos de los puntos que comentas, tienes una pequeña aplicación desarrollada, y otra por desarrollar; sólo el tema de los múltiples almacenes y el traspaso entre ellos, desde mi experiencia, te apuesto a que te/os implicará una refactorización profunda, o directamente una reescritura completa de la base de la aplicación. Suerte con la busqueda de candidato, pero como consejo, en este tipo de anuncios deberías comentar los términos de la "colaboración" (retribución, etc.), eso seguro que haría que la gente se pudiese sentir más interesada, porque tal y como lo comentas, lo que veo es que buscas gente que trabaje gratis en algo que, a priori, parece comercial. Saludos Alberto PD: Mis humildes disculpas también por el top-posting :) El 3 de octubre de 2013 19:28, Eliezer Gallegos escribió: > Hola Gente: > perdon por el OT... > Estoy en la busqueda de alguien que me pueda colaborar para terminar una > Aplicacion de Gestion ya hecha en... Python+wxPython+MySql+Boa-Constructor > y correrá en Windows de todo tipo.... > la Aplicacion ya está casi en su totalidad...... > Que necesito...? > alguien con experiencia en éste tipo de Aplicaciones > (Compras/Facturacion/Inv.)..etc > Porque....? > porque necesito agregar cosas puntuales como: > valorizar el Inventario a Costo Promedio... > agregar que pueda manejar varias sucursales...y varios almacenes. > hacer traspasos de productos/articulos entre almacenes... > hacer un modulo para la toma de Inventario Fisico... > necesito agregar la Facturacion Electronica..... (ésto si no se puede no > hay problema) > y una gran lista de cosas, que necesito para entrar a Produccion lo mas > pronto posible... > estoy en Mexico....... > si alguien se interesa estoy a su disposicion, para platicarlo > mas ampliamente por medio de mi correo...egirun.yahoo.com > > Reciban Saludos > Eliezer Gallegos > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 10:08:15 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 10:08:15 +0200 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> Message-ID: <5260EC6F.9010903@mundo-r.com> Hola, se podrían usar formatos de Excel que sirven tanto para OO como para MsOffice, con estos paquetes para python: Python Excel, aquí: http://www.python-excel.org/ Openpyxl, aquí: https://bitbucket.org/ericgazoni/openpyxl/wiki/Home Un saludo. El 18/10/2013 9:30, Alberto Curro escribió: > Hola, > > 2013/10/13 Andres Vargas - zodman > > > usa relatorio! > > > Aunque relatorio es un proyecto interesante, no es lo que Ramiro > pregunta originalmente. > > Desde mi experiencia, creo que lo tienes complicado a priori, pero no > imposible. Hasta donde yo sé, (no puedo hablar por GTK, yo > desarrollo/desarrollaba en KDE), cosas como el KParts permitían el > embebido de objetos y partes, pero OpenOffice no lo soporta (intentad > copiar una tabla de OpenOffice fuera de OoO y lo comprobáis por > vosotros mismos). GTK seguro que tiene algo parecido, pero estarás en > la misma tesitura. > >  Alguna experiencia tengo también con OLE, y te puedo asegurar que > desde luego la idea en Windows no te lo aconsejaría "ni jarto vino", > por la cantidad de pitfalls y problemas secundarios que vas a > encontrate (además del consumo de memoria, dado que realmente > tendrías una instancia de OoO corriendo en background con su espacio > de memoria, más el espacio de memoria e intercambio OLE, más tu > aplicación). > > La idea de Alexandro parece interesante, e imagino que en GTK tendrás > controles grid de calidad, sólo tendrías que desarrollar el método > de intercambio de datos. > >  En StackOverflow hay también una pregunta parecida, para MacOSX, > échale un vistazo a la respuesta "aprobada", también podría darte > ideas: > >  > http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application > >  Ya contarás. > >  Saludos >  Alberto > > > > > El 12 de octubre de 2013 23:07, Alexandro Colorado > escribió: > > Es un reto interesante, tu puedes controlar OpenOffice > remotamente via > python, y OpenOffice puede funcionar como un servicio. Sin > embargo no > se eso de 'embedir' el workspace de Calc dentro de una ventana > en GTK. > > Quizas, por su cercania al framework tengas mejor suerte usando > Gnumerics. O puedes usar calc como servicio y hacer el > intercambio de > datos. Algo similar a lo que se hizo con Java/Javascript en esta > aplicacion: > http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html > > On 10/12/13, Ramiro > wrote: > > Hola > > > > > >       ¿Es posible ver una planilla de cálculo > de OpenOffice como si > > fuera un control de formulario más en pyGTK?, (al estilo > OLE2 de windows) > > > > > > > > > > > > > > saludos > > > > Ramiro > > _______________________________________________ > > Python-es mailing list > > Python-es en python.org > > https://mail.python.org/mailman/listinfo/python-es > > FAQ: http://python-es-faq.wikidot.com/ > > > > > -- > Alexandro Colorado > Apache OpenOffice Contributor > http://www.openoffice.org > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > -- > Andres Vargas > www.zodman.com.mx > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jza en oooes.org Fri Oct 18 15:41:05 2013 From: jza en oooes.org (Alexandro Colorado) Date: Fri, 18 Oct 2013 13:41:05 +0000 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: <5260EC6F.9010903@mundo-r.com> References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> <5260EC6F.9010903@mundo-r.com> Message-ID: 2013/10/18 Julio S.G. > Hola, se podrían usar formatos de Excel que sirven tanto para OO como > para MsOffice, con estos paquetes para python: > ?Eso no es la pregunta, el generar ODF es muy facil tambien, hay muchas librerias que lo producen. La pregunta va mas a la interfaz/UI de la aplicacion. El re-aprovechar la interfaz de una suite como OpenOffice incrustandola dentro de la aplicacion GTK. ? > > Python Excel, aquí: http://www.python-excel.org/ > Openpyxl, aquí: https://bitbucket.org/ericgazoni/openpyxl/wiki/Home > > Un saludo. > > > El 18/10/2013 9:30, Alberto Curro escribió: > > Hola, > > 2013/10/13 Andres Vargas - zodman > >> usa relatorio! >> > > Aunque relatorio es un proyecto interesante, no es lo que Ramiro > pregunta originalmente. > > Desde mi experiencia, creo que lo tienes complicado a priori, pero no > imposible. Hasta donde yo sé, (no puedo hablar por GTK, yo > desarrollo/desarrollaba en KDE), cosas como el KParts permitían el > embebido de objetos y partes, pero OpenOffice no lo soporta (intentad > copiar una tabla de OpenOffice fuera de OoO y lo comprobáis por vosotros > mismos). GTK seguro que tiene algo parecido, pero estarás en la misma > tesitura. > > ?Es por eso que Gnumerics o KCalc de Calligra pueden tener cierta modularizacion para lograr eso directamente desde el framework. Lo otro es usar webkit, y alguna libreria grid de calculo hecha en Javascript. Buscando encontre SpreadJS http://wijmo.com/widgets/wijmo-enterprise/spreadjs/ > >  Alguna experiencia tengo también con OLE, y te puedo asegurar que desde > luego la idea en Windows no te lo aconsejaría "ni jarto vino", por la > cantidad de pitfalls y problemas secundarios que vas a encontrate (además > del consumo de memoria, dado que realmente tendrías una instancia de OoO > corriendo en background con su espacio de memoria, más el espacio de > memoria e intercambio OLE, más tu aplicación). > > La idea de Alexandro parece interesante, e imagino que en GTK tendrás > controles grid de calidad, sólo tendrías que desarrollar el método de > intercambio de datos. > >  En StackOverflow hay también una pregunta parecida, para MacOSX, > échale un vistazo a la respuesta "aprobada", también podría darte ideas: > >  > http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application > >  Ya contarás. > >  Saludos >  Alberto > > > >> >> El 12 de octubre de 2013 23:07, Alexandro Coloradoescribió: >> >> Es un reto interesante, tu puedes controlar OpenOffice remotamente via >>> python, y OpenOffice puede funcionar como un servicio. Sin embargo no >>> se eso de 'embedir' el workspace de Calc dentro de una ventana en GTK. >>> >>> Quizas, por su cercania al framework tengas mejor suerte usando >>> Gnumerics. O puedes usar calc como servicio y hacer el intercambio de >>> datos. Algo similar a lo que se hizo con Java/Javascript en esta >>> aplicacion: >>> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >>> >>> On 10/12/13, Ramiro wrote: >>> > Hola >>> > >>> > >>> >       ¿Es posible ver una planilla de cálculo de >>> OpenOffice como si >>> > fuera un control de formulario más en pyGTK?, (al estilo OLE2 de >>> windows) >>> >>> > >>> > >>> > >>> > >>> > >>> > >>> > saludos >>> > >>> > Ramiro >>> > _______________________________________________ >>> > Python-es mailing list >>> > Python-es en python.org >>> > https://mail.python.org/mailman/listinfo/python-es >>> > FAQ: http://python-es-faq.wikidot.com/ >>> > >>> >>> >>> -- >>> Alexandro Colorado >>> Apache OpenOffice Contributor >>> http://www.openoffice.org >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >> >> >> >> -- >> Andres Vargas >> www.zodman.com.mx >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Alexandro Colorado Apache OpenOffice Contributor http://www.openoffice.org 882C 4389 3C27 E8DF 41B9 5C4C 1DB7 9D1C 7F4C 2614 ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 16:32:50 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 16:32:50 +0200 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> <5260EC6F.9010903@mundo-r.com> Message-ID: <52614692.6010002@mundo-r.com> OK, para GTK puedes usar gtksheet, que es un fork del widget GTKSheet, con pygtksheet que el binding en python. gtksheet aquí: http://vhernandez.github.io/gtksheet/ pygtksheet aquí: https://github.com/vhernandez/pygtksheet/ Un saludo. El 18/10/2013 15:41, Alexandro Colorado escribió: > > > > 2013/10/18 Julio S.G. > > > Hola, se podrían usar formatos de Excel que sirven tanto para OO > como para MsOffice, con estos paquetes para python: > > > âEURâEUR< > >  > > > Python Excel, aquí: http://www.python-excel.org/ > Openpyxl, aquí: https://bitbucket.org/ericgazoni/openpyxl/wiki/Home > > Un saludo. > >  > El 18/10/2013 9:30, Alberto Curro escribió: >> Hola, >> >> 2013/10/13 Andres Vargas - zodman > > >> >> usa relatorio! >> >> >> Aunque relatorio es un proyecto interesante, no es lo queÃ, >> Ramiro pregunta originalmente. >> >> Desde mi experiencia, creo que lo tienes complicado a priori, >> pero no imposible. Hasta donde yo sÃf©, (no puedo hablar por >> GTK, yo desarrollo/desarrollaba en KDE), cosas como el KParts >> permitÃf­an el embebido de objetos y partes, pero OpenOffice no >> lo soporta (intentad copiar una tabla de OpenOffice fuera de OoO >> y lo comprobÃf¡is por vosotros mismos). GTK seguro que tiene >> algo parecido, pero estarÃf¡s en la misma tesitura. > > > âEUR > Lo otro es usar webkit, y alguna libreria grid de calculo hecha en > Javascript. Buscando encontre SpreadJS > http://wijmo.com/widgets/wijmo-enterprise/spreadjs/ > >  > >> >> Ã, Alguna experiencia tengo tambiÃf©n con OLE, y te puedo >> asegurar que desde luego la idea en Windows no te lo >> aconsejarÃf­a "ni jarto vino", por la cantidad de pitfalls y >> problemas secundarios que vas a encontrate (ademÃf¡s del consumo >> de memoria, dado que realmente tendrÃf­as una instancia de OoO >> corriendo en background con su espacio de memoria, mÃf¡s el >> espacio de memoria e intercambio OLE, mÃf¡s tu aplicaciÃf³n). >> >> La idea de Alexandro parece interesante, e imagino que en GTK >> tendrÃf¡s controles grid de calidad, sÃf³lo tendrÃf­as que >> desarrollar el mÃf©todo de intercambio de datos. >> >> Ã, En StackOverflow hay tambiÃf©n una pregunta parecida, para >> MacOSX, Ãf©chale un vistazo a la respuesta "aprobada", >> tambiÃf©n podrÃf­a darte ideas: >> >> Ã, >> http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application >> >> Ã, Ya contarÃf¡s. >> >> Ã, Saludos >> Ã, Alberto >> >> >> >> >> El 12 de octubre de 2013 23:07, Alexandro >> Colorado> escribiÃf³: >> >> Es un reto interesante, tu puedes controlar OpenOffice >> remotamente via >> python, y OpenOffice puede funcionar como un servicio. >> Sin embargo no >> se eso de 'embedir' el workspace de Calc dentro de una >> ventana en GTK. >> >> Quizas, por su cercania al framework tengas mejor suerte >> usando >> Gnumerics. O puedes usar calc como servicio y hacer el >> intercambio de >> datos. Algo similar a lo que se hizo con Java/Javascript >> en esta >> aplicacion: >> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >> >> On 10/12/13, Ramiro > > wrote: >> > Hola >> > >> > >> > Ã, Ã, Ã, Ã, Ã, Ã, Ã,¿Es posible ver una >> planilla de cÃf¡lculo de OpenOffice como si >> > fuera un control de formulario mÃf¡s en pyGTK?, (al >> estilo OLE2 de windows) >> >> > >> > >> > >> > >> > >> > >> > saludos >> > >> > Ramiro >> > _______________________________________________ >> > Python-es mailing list >> > Python-es en python.org >> > https://mail.python.org/mailman/listinfo/python-es >> > FAQ: http://python-es-faq.wikidot.com/ >> > >> >> >> -- >> Alexandro Colorado >> Apache OpenOffice Contributor >> http://www.openoffice.org >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> -- >> Andres Vargas >> www.zodman.com.mx >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > -- > Alexandro Colorado > Apache OpenOffice Contributor > http://www.openoffice.org > 882C 4389 3C27 E8DF 41B9 5C4C 1DB7 9D1C 7F4C 2614 > > > > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From fdanesse en gmail.com Fri Oct 18 20:52:14 2013 From: fdanesse en gmail.com (Flavio Danesse) Date: Fri, 18 Oct 2013 16:52:14 -0200 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: <52614692.6010002@mundo-r.com> References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> <5260EC6F.9010903@mundo-r.com> <52614692.6010002@mundo-r.com> Message-ID: No se como se puede hacer en este caso en particular, pero capaz que puedo darte algunas pistas: - Se puede embeber toda una interfaz gtk dentro de otra utilizando gtk.Socket y gtk.Plug. - También se puede embeber una interfaz pyqt dentro de una gtk y viceversa utilizando el mismo procedimiento (ambos soportan el protocolo embbed) - También se puede embeber un juego hecho en pygame, en este caso solo hay que pasarle a gtk el id de la ventana de pygame para que se dibuje allí. Sobre estos tres casos te puedo pasar ejemplos si quieres. Creo que también se puede hacer usando DBus. La idea sería ver si tu aplicación soporta embbed y si esto es compatible con gtk o si no, ver si se puede hacer a traves del id de la ventana como con pygame. El 18 de octubre de 2013 12:32, Julio S.G. escribió: > OK, para GTK puedes usar gtksheet, que es un fork del widget GTKSheet, > con pygtksheet que el binding en python. > > gtksheet aquí: http://vhernandez.github.io/gtksheet/ > pygtksheet aquí: https://github.com/vhernandez/pygtksheet/ > > Un saludo. > > > El 18/10/2013 15:41, Alexandro Colorado escribió: > > > > > 2013/10/18 Julio S.G. > >> Hola, se podrían usar formatos de Excel que sirven tanto para OO como >> para MsOffice, con estos paquetes para python: >> > > â??Eso no es la pregunta, el generar ODF es muy facil tambien, hay muchas > librerias que lo producen. La pregunta va mas a la interfaz/UI de la > aplicacion. El re-aprovechar la interfaz de una suite como OpenOffice > incrustandola dentro de la aplicacion GTK. > â?? > >  > >> >> Python Excel, aquí: http://www.python-excel.org/ >> Openpyxl, aquí: https://bitbucket.org/ericgazoni/openpyxl/wiki/Home >> >> Un saludo. >> >>  >> El 18/10/2013 9:30, Alberto Curro escribió: >> >> Hola, >> >> 2013/10/13 Andres Vargas - zodman >> >>> usa relatorio! >>> >> >> Aunque relatorio es un proyecto interesante, no es lo queÃ? Ramiro >> pregunta originalmente. >> >> Desde mi experiencia, creo que lo tienes complicado a priori, pero no >> imposible. Hasta donde yo sÃ?©, (no puedo hablar por GTK, yo >> desarrollo/desarrollaba en KDE), cosas como el KParts permitÃ?­an el >> embebido de objetos y partes, pero OpenOffice no lo soporta (intentad >> copiar una tabla de OpenOffice fuera de OoO y lo comprobÃ?¡is por vosotros >> mismos). GTK seguro que tiene algo parecido, pero estarÃ?¡s en la misma >> tesitura. >> >> > â??Es por eso que Gnumerics o KCalc de Calligra pueden tener cierta > modularizacion para lograr eso directamente desde el framework. > > Lo otro es usar webkit, y alguna libreria grid de calculo hecha en > Javascript. Buscando encontre SpreadJS > http://wijmo.com/widgets/wijmo-enterprise/spreadjs/ > >  > >> >> Ã? Alguna experiencia tengo tambiÃ?©n con OLE, y te puedo asegurar que >> desde luego la idea en Windows no te lo aconsejarÃ?­a "ni jarto vino", por >> la cantidad de pitfalls y problemas secundarios que vas a encontrate >> (ademÃ?¡s del consumo de memoria, dado que realmente tendrÃ?­as una >> instancia de OoO corriendo en background con su espacio de memoria, mÃ?¡s >> el espacio de memoria e intercambio OLE, mÃ?¡s tu aplicaciÃ?³n). >> >> La idea de Alexandro parece interesante, e imagino que en GTK tendrÃ?¡s >> controles grid de calidad, sÃ?³lo tendrÃ?­as que desarrollar el mÃ?©todo >> de intercambio de datos. >> >> Ã? En StackOverflow hay tambiÃ?©n una pregunta parecida, para MacOSX, >> Ã?©chale un vistazo a la respuesta "aprobada", tambiÃ?©n podrÃ?­a darte >> ideas: >> >> Ã? >> http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application >> >> Ã? Ya contarÃ?¡s. >> >> Ã? Saludos >> Ã? Alberto >> >> >> >>> >>> El 12 de octubre de 2013 23:07, Alexandro ColoradoescribiÃ?³: >>> >>> Es un reto interesante, tu puedes controlar OpenOffice remotamente via >>>> python, y OpenOffice puede funcionar como un servicio. Sin embargo no >>>> se eso de 'embedir' el workspace de Calc dentro de una ventana en GTK. >>>> >>>> Quizas, por su cercania al framework tengas mejor suerte usando >>>> Gnumerics. O puedes usar calc como servicio y hacer el intercambio de >>>> datos. Algo similar a lo que se hizo con Java/Javascript en esta >>>> aplicacion: >>>> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >>>> >>>> On 10/12/13, Ramiro wrote: >>>> > Hola >>>> > >>>> > >>>> > Ã? Ã? Ã? Ã? Ã? Ã? Ã?¿Es posible ver una planilla de >>>> cÃ?¡lculo de OpenOffice como si >>>> > fuera un control de formulario mÃ?¡s en pyGTK?, (al estilo OLE2 de >>>> windows) >>>> >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > saludos >>>> > >>>> > Ramiro >>>> > _______________________________________________ >>>> > Python-es mailing list >>>> > Python-es en python.org >>>> > https://mail.python.org/mailman/listinfo/python-es >>>> > FAQ: http://python-es-faq.wikidot.com/ >>>> > >>>> >>>> >>>> -- >>>> Alexandro Colorado >>>> Apache OpenOffice Contributor >>>> http://www.openoffice.org >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>> >>> >>> >>> -- >>> Andres Vargas >>> www.zodman.com.mx >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >> >> >> _______________________________________________ >> Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Alexandro Colorado > Apache OpenOffice Contributor > http://www.openoffice.org > 882C 4389 3C27 E8DF 41B9 5C4C 1DB7 9D1C 7F4C 2614 > > > > > > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 20:58:27 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 20:58:27 +0200 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> <5260EC6F.9010903@mundo-r.com> <52614692.6010002@mundo-r.com> Message-ID: <526184D3.8030201@mundo-r.com> Hay también una solución indirecta, puedes integrar un control navegador web con tu grid de datos y exportarlo al formato que necesites. Puede ser la opción más sencilla. Un saludo. El 18/10/2013 20:52, Flavio Danesse escribió: > No se como se puede hacer en este caso en particular, pero capaz que > puedo darte algunas pistas: > > * Se puede embeber toda una interfaz gtk dentro de otra utilizando > gtk.Socket y gtk.Plug. > * También se puede embeber una interfaz pyqt dentro de una gtk y > viceversa utilizando el mismo procedimiento (ambos soportan el > protocolo embbed) > * También se puede embeber un juego hecho en pygame, en este caso > solo hay que pasarle a gtk el id de la ventana de pygame para que > se dibuje allí. > > Sobre estos tres casos te puedo pasar ejemplos si quieres. > > Creo que también se puede hacer usando DBus. > > La idea sería ver si tu aplicación soporta embbed y si esto es > compatible con gtk o si no, ver si se puede hacer a traves del id de > la ventana como con pygame. > > > > El 18 de octubre de 2013 12:32, Julio S.G. > escribió: > > OK, para GTK puedes usar gtksheet, que es un fork del widget > GTKSheet, con pygtksheet que el binding en python. > > gtksheet aquí: http://vhernandez.github.io/gtksheet/ > pygtksheet aquí: https://github.com/vhernandez/pygtksheet/ > > Un saludo. > > > El 18/10/2013 15:41, Alexandro Colorado escribió: >> >> >> >> 2013/10/18 Julio S.G. > > >> >> Hola, se podrÃf­an usar formatos de Excel que sirven tanto >> para OO como para MsOffice, con estos paquetes para python: >> >> >> ââ,¬âEUR¹Eso no es la pregunta, el generar ODF es muy facil >> tambien, hay muchas librerias que lo producen. La pregunta va mas >> a la interfaz/UI de la aplicacion. El re-aprovechar la interfaz >> de una suite como OpenOffice incrustandola dentro de la >> aplicacion GTK. >> ââ,¬âEUR¹ >> >> Ã, >> >> >> Python Excel, aquÃf­: http://www.python-excel.org/ >> Openpyxl, aquÃf­: >> https://bitbucket.org/ericgazoni/openpyxl/wiki/Home >> >> Un saludo. >> >> Ã, >> El 18/10/2013 9:30, Alberto Curro escribiÃf³: >>> Hola, >>> >>> 2013/10/13 Andres Vargas - zodman >> > >>> >>> usa relatorio! >>> >>> >>> Aunque relatorio es un proyecto interesante, no es lo >>> queÃfâEURs(Ã, Ramiro pregunta originalmente. >>> >>> Desde mi experiencia, creo que lo tienes complicado a >>> priori, pero no imposible. Hasta donde yo sÃfÆ'Ã,©, (no >>> puedo hablar por GTK, yo desarrollo/desarrollaba en KDE), >>> cosas como el KParts permitÃfÆ'Ã,­an el embebido de objetos >>> y partes, pero OpenOffice no lo soporta (intentad copiar una >>> tabla de OpenOffice fuera de OoO y lo comprobÃfÆ'Ã,¡is por >>> vosotros mismos). GTK seguro que tiene algo parecido, pero >>> estarÃfÆ'Ã,¡s en la misma tesitura. >> >> >> ââ,¬âEUR¹Es por eso que Gnumerics o KCalc de Calligra pueden >> tener cierta modularizacion para lograr eso directamente desde el >> framework. >> >> Lo otro es usar webkit, y alguna libreria grid de calculo hecha >> en Javascript. Buscando encontre SpreadJS >> http://wijmo.com/widgets/wijmo-enterprise/spreadjs/ >> >> Ã, >> >>> >>> ÃfâEURs(Ã, Alguna experiencia tengo tambiÃfÆ'Ã,©n con OLE, >>> y te puedo asegurar que desde luego la idea en Windows no te >>> lo aconsejarÃfÆ'Ã,­a "ni jarto vino", por la cantidad de >>> pitfalls y problemas secundarios que vas a encontrate >>> (ademÃfÆ'Ã,¡s del consumo de memoria, dado que realmente >>> tendrÃfÆ'Ã,­as una instancia de OoO corriendo en background >>> con su espacio de memoria, mÃfÆ'Ã,¡s el espacio de memoria >>> e intercambio OLE, mÃfÆ'Ã,¡s tu aplicaciÃfÆ'Ã,³n). >>> >>> La idea de Alexandro parece interesante, e imagino que en >>> GTK tendrÃfÆ'Ã,¡s controles grid de calidad, sÃfÆ'Ã,³lo >>> tendrÃfÆ'Ã,­as que desarrollar el mÃfÆ'Ã,©todo de >>> intercambio de datos. >>> >>> ÃfâEURs(Ã, En StackOverflow hay tambiÃfÆ'Ã,©n una pregunta >>> parecida, para MacOSX, ÃfÆ'Ã,©chale un vistazo a la >>> respuesta "aprobada", tambiÃfÆ'Ã,©n podrÃfÆ'Ã,­a darte ideas: >>> >>> ÃfâEURs(Ã, >>> http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application >>> >>> ÃfâEURs(Ã, Ya contarÃfÆ'Ã,¡s. >>> >>> ÃfâEURs(Ã, Saludos >>> ÃfâEURs(Ã, Alberto >>> >>> >>> >>> >>> El 12 de octubre de 2013 23:07, Alexandro >>> Colorado> >>> escribiÃfÆ'Ã,³: >>> >>> Es un reto interesante, tu puedes controlar >>> OpenOffice remotamente via >>> python, y OpenOffice puede funcionar como un >>> servicio. Sin embargo no >>> se eso de 'embedir' el workspace de Calc dentro de >>> una ventana en GTK. >>> >>> Quizas, por su cercania al framework tengas mejor >>> suerte usando >>> Gnumerics. O puedes usar calc como servicio y hacer >>> el intercambio de >>> datos. Algo similar a lo que se hizo con >>> Java/Javascript en esta >>> aplicacion: >>> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >>> >>> On 10/12/13, Ramiro >> > wrote: >>> > Hola >>> > >>> > >>> > ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã, >>> ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã,¿Es posible ver >>> una planilla de cÃfÆ'Ã,¡lculo de OpenOffice como si >>> > fuera un control de formulario mÃfÆ'Ã,¡s en >>> pyGTK?, (al estilo OLE2 de windows) >>> >>> > >>> > >>> > >>> > >>> > >>> > >>> > saludos >>> > >>> > Ramiro >>> > _______________________________________________ >>> > Python-es mailing list >>> > Python-es en python.org >>> > https://mail.python.org/mailman/listinfo/python-es >>> > FAQ: http://python-es-faq.wikidot.com/ >>> > >>> >>> >>> -- >>> Alexandro Colorado >>> Apache OpenOffice Contributor >>> http://www.openoffice.org >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> >>> >>> -- >>> Andres Vargas >>> www.zodman.com.mx >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ:http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> -- >> Alexandro Colorado >> Apache OpenOffice Contributor >> http://www.openoffice.org >> 882C 4389 3C27 E8DF 41B9Ã, 5C4C 1DB7 9D1C 7F4C 2614 >> >> >> >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 23:06:15 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 23:06:15 +0200 Subject: [Python-es] Integrar OpenOffice-CALC en un programa python In-Reply-To: <526184D3.8030201@mundo-r.com> References: <1381625304.82472.YahooMailNeo@web121904.mail.ne1.yahoo.com> <5260EC6F.9010903@mundo-r.com> <52614692.6010002@mundo-r.com> <526184D3.8030201@mundo-r.com> Message-ID: <5261A2C7.4090405@mundo-r.com> Y por cierto, estoy encantado de analizarte el problema, pero solo hasta un límite. Tienes software y tienes ideas. Ahora trabaja. Un saludo. Un saludo. El 18/10/2013 20:58, Julio S.G. escribió: > Hay también una solución indirecta, puedes integrar un control > navegador web con tu grid de datos y exportarlo al formato que necesites. > Puede ser la opción más sencilla. > > Un saludo. > > > El 18/10/2013 20:52, Flavio Danesse escribió: >> No se como se puede hacer en este caso en particular, pero capaz que >> puedo darte algunas pistas: >> >> * Se puede embeber toda una interfaz gtk dentro de otra utilizando >> gtk.Socket y gtk.Plug. >> * También se puede embeber una interfaz pyqt dentro de una gtk y >> viceversa utilizando el mismo procedimiento (ambos soportan el >> protocolo embbed) >> * También se puede embeber un juego hecho en pygame, en este caso >> solo hay que pasarle a gtk el id de la ventana de pygame para que >> se dibuje allí. >> >> Sobre estos tres casos te puedo pasar ejemplos si quieres. >> >> Creo que también se puede hacer usando DBus. >> >> La idea sería ver si tu aplicación soporta embbed y si esto es >> compatible con gtk o si no, ver si se puede hacer a traves del id de >> la ventana como con pygame. >> >> >> >> El 18 de octubre de 2013 12:32, Julio S.G. > > escribió: >> >> OK, para GTK puedes usar gtksheet, que es un fork del widget >> GTKSheet, con pygtksheet que el binding en python. >> >> gtksheet aquí: http://vhernandez.github.io/gtksheet/ >> pygtksheet aquí: https://github.com/vhernandez/pygtksheet/ >> >> Un saludo. >> >> >> El 18/10/2013 15:41, Alexandro Colorado escribió: >>> >>> >>> >>> 2013/10/18 Julio S.G. >> > >>> >>> Hola, se podrÃf­an usar formatos de Excel que sirven tanto >>> para OO como para MsOffice, con estos paquetes para python: >>> >>> >>> ââ,¬âEUR¹Eso no es la pregunta, el generar ODF es muy facil >>> tambien, hay muchas librerias que lo producen. La pregunta va >>> mas a la interfaz/UI de la aplicacion. El re-aprovechar la >>> interfaz de una suite como OpenOffice incrustandola dentro de la >>> aplicacion GTK. >>> ââ,¬âEUR¹ >>> >>> Ã, >>> >>> >>> Python Excel, aquÃf­: http://www.python-excel.org/ >>> Openpyxl, aquÃf­: >>> https://bitbucket.org/ericgazoni/openpyxl/wiki/Home >>> >>> Un saludo. >>> >>> Ã, >>> El 18/10/2013 9:30, Alberto Curro escribiÃf³: >>>> Hola, >>>> >>>> 2013/10/13 Andres Vargas - zodman >>> > >>>> >>>> usa relatorio! >>>> >>>> >>>> Aunque relatorio es un proyecto interesante, no es lo >>>> queÃfâEURs(Ã, Ramiro pregunta originalmente. >>>> >>>> Desde mi experiencia, creo que lo tienes complicado a >>>> priori, pero no imposible. Hasta donde yo sÃfÆ'Ã,©, (no >>>> puedo hablar por GTK, yo desarrollo/desarrollaba en KDE), >>>> cosas como el KParts permitÃfÆ'Ã,­an el embebido de >>>> objetos y partes, pero OpenOffice no lo soporta (intentad >>>> copiar una tabla de OpenOffice fuera de OoO y lo >>>> comprobÃfÆ'Ã,¡is por vosotros mismos). GTK seguro que >>>> tiene algo parecido, pero estarÃfÆ'Ã,¡s en la misma tesitura. >>> >>> >>> ââ,¬âEUR¹Es por eso que Gnumerics o KCalc de Calligra pueden >>> tener cierta modularizacion para lograr eso directamente desde >>> el framework. >>> >>> Lo otro es usar webkit, y alguna libreria grid de calculo hecha >>> en Javascript. Buscando encontre SpreadJS >>> http://wijmo.com/widgets/wijmo-enterprise/spreadjs/ >>> >>> Ã, >>> >>>> >>>> ÃfâEURs(Ã, Alguna experiencia tengo tambiÃfÆ'Ã,©n con >>>> OLE, y te puedo asegurar que desde luego la idea en Windows >>>> no te lo aconsejarÃfÆ'Ã,­a "ni jarto vino", por la >>>> cantidad de pitfalls y problemas secundarios que vas a >>>> encontrate (ademÃfÆ'Ã,¡s del consumo de memoria, dado que >>>> realmente tendrÃfÆ'Ã,­as una instancia de OoO corriendo en >>>> background con su espacio de memoria, mÃfÆ'Ã,¡s el espacio >>>> de memoria e intercambio OLE, mÃfÆ'Ã,¡s tu >>>> aplicaciÃfÆ'Ã,³n). >>>> >>>> La idea de Alexandro parece interesante, e imagino que en >>>> GTK tendrÃfÆ'Ã,¡s controles grid de calidad, sÃfÆ'Ã,³lo >>>> tendrÃfÆ'Ã,­as que desarrollar el mÃfÆ'Ã,©todo de >>>> intercambio de datos. >>>> >>>> ÃfâEURs(Ã, En StackOverflow hay tambiÃfÆ'Ã,©n una >>>> pregunta parecida, para MacOSX, ÃfÆ'Ã,©chale un vistazo a >>>> la respuesta "aprobada", tambiÃfÆ'Ã,©n podrÃfÆ'Ã,­a darte >>>> ideas: >>>> >>>> ÃfâEURs(Ã, >>>> http://stackoverflow.com/questions/3120622/how-do-i-embed-openoffice-calc-into-my-own-application >>>> >>>> ÃfâEURs(Ã, Ya contarÃfÆ'Ã,¡s. >>>> >>>> ÃfâEURs(Ã, Saludos >>>> ÃfâEURs(Ã, Alberto >>>> >>>> >>>> >>>> >>>> El 12 de octubre de 2013 23:07, Alexandro >>>> Colorado> >>>> escribiÃfÆ'Ã,³: >>>> >>>> Es un reto interesante, tu puedes controlar >>>> OpenOffice remotamente via >>>> python, y OpenOffice puede funcionar como un >>>> servicio. Sin embargo no >>>> se eso de 'embedir' el workspace de Calc dentro de >>>> una ventana en GTK. >>>> >>>> Quizas, por su cercania al framework tengas mejor >>>> suerte usando >>>> Gnumerics. O puedes usar calc como servicio y hacer >>>> el intercambio de >>>> datos. Algo similar a lo que se hizo con >>>> Java/Javascript en esta >>>> aplicacion: >>>> http://www.javaworld.com/javaworld/jw-05-2008/jw-05-spreadsheets.html >>>> >>>> On 10/12/13, Ramiro >>> > wrote: >>>> > Hola >>>> > >>>> > >>>> > ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã, >>>> ÃfâEURs(Ã, ÃfâEURs(Ã, ÃfâEURs(Ã,¿Es posible ver >>>> una planilla de cÃfÆ'Ã,¡lculo de OpenOffice como si >>>> > fuera un control de formulario mÃfÆ'Ã,¡s en >>>> pyGTK?, (al estilo OLE2 de windows) >>>> >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > saludos >>>> > >>>> > Ramiro >>>> > _______________________________________________ >>>> > Python-es mailing list >>>> > Python-es en python.org >>>> > https://mail.python.org/mailman/listinfo/python-es >>>> > FAQ: http://python-es-faq.wikidot.com/ >>>> > >>>> >>>> >>>> -- >>>> Alexandro Colorado >>>> Apache OpenOffice Contributor >>>> http://www.openoffice.org >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>>> >>>> >>>> -- >>>> Andres Vargas >>>> www.zodman.com.mx >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ:http://python-es-faq.wikidot.com/ >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> >>> >>> -- >>> Alexandro Colorado >>> Apache OpenOffice Contributor >>> http://www.openoffice.org >>> 882C 4389 3C27 E8DF 41B9Ã, 5C4C 1DB7 9D1C 7F4C 2614 >>> >>> >>> >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ:http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From monobot.soft en gmail.com Fri Oct 18 23:19:35 2013 From: monobot.soft en gmail.com (monoBOT) Date: Fri, 18 Oct 2013 22:19:35 +0100 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ Message-ID: http://www.codersclan.net/ Ya entiendo que algunos quieran sacar algo de tajada de su conocimiento en ventaja de los que no lo tienen. Y que hay mucha gente que se aprovecha de la buena fe de los foreros o listeros en nuestro caso para que les saquen las castañas del fuego sin habérselo mirado ni siquiera un poco antes. Pero esta página en particular algo bastante insólito en el mundo de la programación desde que yo lo conozco, sobretodo habiendo sitios con tanto éxito y con tanto conocimiento almacenado como stackoverflow por ejemplo. Vosotr en s que pensáis? Saludos -- *monoBOT* Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 23:36:18 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 23:36:18 +0200 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: References: Message-ID: <5261A9D2.5060804@mundo-r.com> Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el ladrón que son todos de su condición. Ahora entiendo a los que están cansados. Perdóname, si me he pasado, pero ya llega de analizarle y programarle el tema a nadie. Un poco de interés y trabajo de los que preguntan no estaría mal. El 18/10/2013 23:19, monoBOT escribió: > http://www.codersclan.net/ > > Ya entiendo que algunos quieran sacar algo de tajada de su > conocimiento en ventaja de los que no lo tienen. Y que hay mucha gente > que se aprovecha de la buena fe de los foreros o listeros en nuestro > caso para que les saquen las castañas del fuego sin habérselo mirado > ni siquiera un poco antes. > > Pero esta página en particular algo bastante insólito en el mundo de > la programación desde que yo lo conozco, sobretodo habiendo sitios con > tanto éxito y con tanto conocimiento almacenado como stackoverflow por > ejemplo. > > Vosotr en s que pensáis? > > Saludos > > -- > *monoBOT* > Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Fri Oct 18 23:54:00 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Fri, 18 Oct 2013 23:54:00 +0200 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: <5261A9D2.5060804@mundo-r.com> References: <5261A9D2.5060804@mundo-r.com> Message-ID: <5261ADF8.1000901@mundo-r.com> Ah, eres un mediador muy malo, el ser correcto, con alguien que no ha insultado a nadie, no funciona. Nos vemos en CRG. Un saludo. El 18/10/2013 23:36, Julio S.G. escribió: > Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el ladrón > que son todos de su condición. > Ahora entiendo a los que están cansados. Perdóname, si me he pasado, > pero ya llega de analizarle y programarle el tema a nadie. Un poco de > interés y trabajo de los que preguntan no estaría mal. > > > > > El 18/10/2013 23:19, monoBOT escribió: >> http://www.codersclan.net/ >> >> Ya entiendo que algunos quieran sacar algo de tajada de su >> conocimiento en ventaja de los que no lo tienen. Y que hay mucha >> gente que se aprovecha de la buena fe de los foreros o listeros en >> nuestro caso para que les saquen las castañas del fuego sin habérselo >> mirado ni siquiera un poco antes. >> >> Pero esta página en particular algo bastante insólito en el mundo de >> la programación desde que yo lo conozco, sobretodo habiendo sitios >> con tanto éxito y con tanto conocimiento almacenado como >> stackoverflow por ejemplo. >> >> Vosotr en s que pensáis? >> >> Saludos >> >> -- >> *monoBOT* >> Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From maengora en gmail.com Fri Oct 18 23:55:58 2013 From: maengora en gmail.com (=?ISO-8859-1?Q?Manuel_Enrique_Gonz=E1lez_Ram=EDrez?=) Date: Fri, 18 Oct 2013 16:55:58 -0500 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: <5261ADF8.1000901@mundo-r.com> References: <5261A9D2.5060804@mundo-r.com> <5261ADF8.1000901@mundo-r.com> Message-ID: Pues el que quiera gastar dinero para que le resuelvan dudas de Python, si lo tiene en su bolsillo que lo haga... cada quien con lo suyo no? Vivir y dejar vivir. El 18 de octubre de 2013 16:54, Julio S.G. escribió: > Ah, eres un mediador muy malo, el ser correcto, con alguien que no ha > insultado a nadie, no funciona. > Nos vemos en CRG. > > Un saludo. > > > El 18/10/2013 23:36, Julio S.G. escribió: > > Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el ladrón que > son todos de su condición. > Ahora entiendo a los que están cansados. Perdóname, si me he pasado, pero > ya llega de analizarle y programarle el tema a nadie. Un poco de interés y > trabajo de los que preguntan no estaría mal. > > > > > El 18/10/2013 23:19, monoBOT escribió: > > http://www.codersclan.net/ > > Ya entiendo que algunos quieran sacar algo de tajada de su conocimiento > en ventaja de los que no lo tienen. Y que hay mucha gente que se aprovecha > de la buena fe de los foreros o listeros en nuestro caso para que les > saquen las castañas del fuego sin habérselo mirado ni siquiera un poco > antes. > > Pero esta página en particular algo bastante insólito en el mundo de la > programación desde que yo lo conozco, sobretodo habiendo sitios con tanto > éxito y con tanto conocimiento almacenado como stackoverflow por ejemplo. > > Vosotr en s que pensáis? > > Saludos > > -- > *monoBOT* > Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es > > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Manuel Enrique González Ramírez http://maengora.com ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Sat Oct 19 00:03:47 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Sat, 19 Oct 2013 00:03:47 +0200 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: References: <5261A9D2.5060804@mundo-r.com> <5261ADF8.1000901@mundo-r.com> Message-ID: <5261B043.9080802@mundo-r.com> En esta lista, contestamos hasta que nos cansamos de tonterías de los que preguntan. Hasta ahora, yo contesto gratis. Pero estupideces, salvo esta y única, no. El 18/10/2013 23:55, Manuel Enrique González Ramírez escribió: > Pues el que quiera gastar dinero para que le resuelvan dudas de > Python, si lo tiene en su bolsillo que lo haga... cada quien con lo > suyo no? Vivir y dejar vivir. > > > El 18 de octubre de 2013 16:54, Julio S.G. > escribió: > > Ah, eres un mediador muy malo, el ser correcto, con alguien que no > ha insultado a nadie, no funciona. > Nos vemos en CRG. > > Un saludo. > > > El 18/10/2013 23:36, Julio S.G. escribió: >> Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el >> ladrón que son todos de su condición. >> Ahora entiendo a los que están cansados. Perdóname, si me he >> pasado, pero ya llega de analizarle y programarle el tema a >> nadie. Un poco de interés y trabajo de los que preguntan no >> estaría mal. >> >> >> >> >> El 18/10/2013 23:19, monoBOT escribió: >>> http://www.codersclan.net/ >>> >>> Ya entiendo que algunos quieran sacar algo de tajada de su >>> conocimiento en ventaja de los que no lo tienen. Y que hay mucha >>> gente que se aprovecha de la buena fe de los foreros o listeros >>> en nuestro caso para que les saquen las castañas del fuego sin >>> habérselo mirado ni siquiera un poco antes. >>> >>> Pero esta página en particular algo bastante insólito en el >>> mundo de la programación desde que yo lo conozco, sobretodo >>> habiendo sitios con tanto éxito y con tanto conocimiento >>> almacenado como stackoverflow por ejemplo. >>> >>> Vosotr en s que pensáis? >>> >>> Saludos >>> >>> -- >>> *monoBOT* >>> Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ:http://python-es-faq.wikidot.com/ >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > -- > Manuel Enrique González Ramírez > http://maengora.com > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From julio.sg en mundo-r.com Sat Oct 19 00:22:05 2013 From: julio.sg en mundo-r.com (Julio S.G.) Date: Sat, 19 Oct 2013 00:22:05 +0200 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: <5261B043.9080802@mundo-r.com> References: <5261A9D2.5060804@mundo-r.com> <5261ADF8.1000901@mundo-r.com> <5261B043.9080802@mundo-r.com> Message-ID: <5261B48D.9080209@mundo-r.com> Un inciso, yo no demonizo a quién con su mucho trabajo se gane la vida dando soporte de lenguajes o S.O. Me he ganado la vida con ello. Mi mayor respeto, y mis disculpas si he ofendido a alguien. Pocas personas se dan cuenta del trabajo que da estar al día. Perdón a todos. El 19/10/2013 0:03, Julio S.G. escribió: > En esta lista, contestamos hasta que nos cansamos de tonterías de los > que preguntan. Hasta ahora, yo contesto gratis. Pero estupideces, > salvo esta y única, no. > > El 18/10/2013 23:55, Manuel Enrique González Ramírez escribió: >> Pues el que quiera gastar dinero para que le resuelvan dudas de >> Python, si lo tiene en su bolsillo que lo haga... cada quien con lo >> suyo no? Vivir y dejar vivir. >> >> >> El 18 de octubre de 2013 16:54, Julio S.G. > > escribió: >> >> Ah, eres un mediador muy malo, el ser correcto, con alguien que >> no ha insultado a nadie, no funciona. >> Nos vemos en CRG. >> >> Un saludo. >> >> >> El 18/10/2013 23:36, Julio S.G. escribió: >>> Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el >>> ladrón que son todos de su condición. >>> Ahora entiendo a los que están cansados. Perdóname, si me he >>> pasado, pero ya llega de analizarle y programarle el tema a >>> nadie. Un poco de interés y trabajo de los que preguntan no >>> estaría mal. >>> >>> >>> >>> >>> El 18/10/2013 23:19, monoBOT escribió: >>>> http://www.codersclan.net/ >>>> >>>> Ya entiendo que algunos quieran sacar algo de tajada de su >>>> conocimiento en ventaja de los que no lo tienen. Y que hay >>>> mucha gente que se aprovecha de la buena fe de los foreros o >>>> listeros en nuestro caso para que les saquen las castañas del >>>> fuego sin habérselo mirado ni siquiera un poco antes. >>>> >>>> Pero esta página en particular algo bastante insólito en el >>>> mundo de la programación desde que yo lo conozco, sobretodo >>>> habiendo sitios con tanto éxito y con tanto conocimiento >>>> almacenado como stackoverflow por ejemplo. >>>> >>>> Vosotr en s que pensáis? >>>> >>>> Saludos >>>> >>>> -- >>>> *monoBOT* >>>> Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ:http://python-es-faq.wikidot.com/ >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ:http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> -- >> Manuel Enrique González Ramírez >> http://maengora.com >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ:http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From oinos en web.de Thu Oct 17 21:15:06 2013 From: oinos en web.de (=?ISO-8859-1?Q?Pablo_Rodr=EDguez?=) Date: Thu, 17 Oct 2013 21:15:06 +0200 Subject: [Python-es] =?iso-8859-1?q?=5Bpygtk=5D_pinchar_el_rat=F3n_no_func?= =?iso-8859-1?q?iona?= Message-ID: <5260373A.3090902@web.de> Hola a todas y todos, tengo un pequeño programilla del que ni me acuerdo cómo escribí. (El ejemplo está abajo.) Todo funciona, pero necesito implementar "button_press_event()". Me temo que no tira de ningún modo. De lo que sé (que es muy poco), debería funcionar. ¿Alguien sería tan amable de indicarme el error? Sé que es una cuestión específica de PyGTK. Hace tres meses que lo he preguntado en la lista y no he tenido respuesta. Agradecería mucho vuestra ayuda. Saludos, Pablo import gnomevfs import gtk import pygtk try: import poppler except: print "poppler is not available" import sys import cairo import gtk.glade class rec_presentation: def __init__(self): uri = gnomevfs.make_uri_from_shell_arg(sys.argv[1]) self.filename = sys.argv[1] self.document = poppler.document_new_from_file (uri, None) self.n_pages = self.document.get_n_pages() self.page_selector = self.document.get_page(0) self.current_page = 0 self.gui = gtk.glade.XML("recslides.glade","mainwindow", domain="recslides") self.win = self.gui.get_widget("mainwindow") self.area = self.gui.get_widget("pdfdocument_area") self.gui.signal_autoconnect(self) self.win.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.width, self.height = self.win.get_size() self.page_width, self.page_height= self.page_selector.get_size() self.surface = cairo.ImageSurface(cairo.FORMAT_RGB24, int(self.width), int(self.height)) black = gtk.gdk.color_parse("black") self.area.modify_bg(gtk.STATE_NORMAL, black) self.area.set_size_request(int(self.width), int(self.height)) self.win.show_all() def button_press_event(self, widget, event): if event.button == 1: print 'Clicked at x={0}, y={0}'.format(event.x, event.y) self.win.connect('button-press-event', button_press_event) def on_expose_event(self, widget, event): add_x = 0 add_y = 0 if (self.area.allocation.width/self.page_width) < (self.area.allocation.height/self.page_height): self.scale = self.area.allocation.width/self.page_width else: self.scale = self.area.allocation.height/self.page_height if (self.area.allocation.width/self.page_width) > (self.area.allocation.height/self.page_height): add_x= int(((self.area.allocation.width-(self.page_width*self.scale))/2)/self.scale) else: add_y= int(((self.area.allocation.height-(self.page_height*self.scale))/2)/self.scale) cr = widget.window.cairo_create() cr.set_source_surface(self.surface) cr.set_source_rgb(1, 1, 1) if self.scale != 1: cr.scale(self.scale, self.scale) cr.translate(add_x, add_y) cr.rectangle(0, 0, self.page_width, self.page_height) cr.fill() self.page_selector.render(cr) def gtk_main_quit(self, widget, event): gtk.main_quit() def main(self): gtk.main() rec = rec_presentation() rec.main() -- http://www.ousia.tk From unab99 en gmail.com Fri Oct 18 15:48:03 2013 From: unab99 en gmail.com (Jairo Edinson Bermudez Sandoval) Date: Fri, 18 Oct 2013 08:48:03 -0500 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: Opino lo mismo,, aprender ingles .. es mejor .. segundo cuando estas aprendiendo .. te enfocas mas en aprender ya que a la vez aprendes ingles y el lenguaje python ., :D El 17 de octubre de 2013 09:01, monoBOT escribió: > > El 17 de octubre de 2013 03:01, Alexandro Colorado escribió: > > De hecho lo realmente malo es que TU no sabes ingles. > > > es una forma un poco burra de decirlo, lo cierto es que no solo debe > siempre ser el primer paso si quieres aprender programación. > > > > -- > *monoBOT* > Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- Att: Jairo Edinson Bermudez Sandoval Ing. Sistemas http://dador33.blogspot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From ochoa.j en gmail.com Sat Oct 19 00:23:19 2013 From: ochoa.j en gmail.com (Jorge Ochoa) Date: Fri, 18 Oct 2013 16:23:19 -0600 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: <5261B48D.9080209@mundo-r.com> References: <5261A9D2.5060804@mundo-r.com> <5261ADF8.1000901@mundo-r.com> <5261B043.9080802@mundo-r.com> <5261B48D.9080209@mundo-r.com> Message-ID: Por favor, no sigan llenando la lista de Spam... :( El 18 de octubre de 2013 16:22, Julio S.G. escribió: > Un inciso, yo no demonizo a quién con su mucho trabajo se gane la vida > dando soporte de lenguajes o S.O. Me he ganado la vida con ello. > Mi mayor respeto, y mis disculpas si he ofendido a alguien. > Pocas personas se dan cuenta del trabajo que da estar al día. > > Perdón a todos. > > > El 19/10/2013 0:03, Julio S.G. escribió: > > En esta lista, contestamos hasta que nos cansamos de tonterías de los que > preguntan. Hasta ahora, yo contesto gratis. Pero estupideces, salvo esta y > única, no. > > El 18/10/2013 23:55, Manuel Enrique González Ramírez escribió: > > Pues el que quiera gastar dinero para que le resuelvan dudas de Python, si > lo tiene en su bolsillo que lo haga... cada quien con lo suyo no? Vivir y > dejar vivir. > > > El 18 de octubre de 2013 16:54, Julio S.G. escribió: > >> Ah, eres un mediador muy malo, el ser correcto, con alguien que no ha >> insultado a nadie, no funciona. >> Nos vemos en CRG. >> >> Un saludo. >> >> >> El 18/10/2013 23:36, Julio S.G. escribió: >> >> Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el ladrón >> que son todos de su condición. >> Ahora entiendo a los que están cansados. Perdóname, si me he pasado, pero >> ya llega de analizarle y programarle el tema a nadie. Un poco de interés y >> trabajo de los que preguntan no estaría mal. >> >> >> >> >> El 18/10/2013 23:19, monoBOT escribió: >> >> http://www.codersclan.net/ >> >> Ya entiendo que algunos quieran sacar algo de tajada de su conocimiento >> en ventaja de los que no lo tienen. Y que hay mucha gente que se aprovecha >> de la buena fe de los foreros o listeros en nuestro caso para que les >> saquen las castañas del fuego sin habérselo mirado ni siquiera un poco >> antes. >> >> Pero esta página en particular algo bastante insólito en el mundo de la >> programación desde que yo lo conozco, sobretodo habiendo sitios con tanto >> éxito y con tanto conocimiento almacenado como stackoverflow por ejemplo. >> >> Vosotr en s que pensáis? >> >> Saludos >> >> -- >> *monoBOT* >> Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es >> >> >> >> _______________________________________________ >> Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> _______________________________________________ >> Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > > -- > Manuel Enrique González Ramírez > http://maengora.com > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing listPython-es en python.orghttps://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- *Jorge Alberto Ochoa Rebollo.* *Web developer | Java codding | OpenSourceCode* *msn: ochoa.j en hotmail.com* *skype: ochoa.jao* *twitter: @kr0nicas* ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Oct 19 02:46:32 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 19 Oct 2013 02:46:32 +0200 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: References: Message-ID: El día 18 de octubre de 2013 23:19, monoBOT escribió: > http://www.codersclan.net/ > > Ya entiendo que algunos quieran sacar algo de tajada de su conocimiento en > ventaja de los que no lo tienen. Y que hay mucha gente que se aprovecha de > la buena fe de los foreros o listeros en nuestro caso para que les saquen > las castañas del fuego sin habérselo mirado ni siquiera un poco antes. > > Pero esta página en particular algo bastante insólito en el mundo de la > programación desde que yo lo conozco, sobretodo habiendo sitios con tanto > éxito y con tanto conocimiento almacenado como stackoverflow por ejemplo. > > Vosotr en s que pensáis? No es tan insólito. Experts Exchange (http://www.experts-exchange.com/) lleva desde 1996 ofreciendo este tipo de servicios. Precisamente, StackOverflow surgió como respuesta. IMHO, este tipo de páginas siempre se ha considerado una forma posible de recompensar los esfuerzos de los desarrolladores de software libre. Pero cobrar por ayudar desvirtuaría mucho los méritos de estos expertos, y en este mundo la "meritocracia" lo es todo. Para que funcione algo así, se deberían plantear verdaderos retos cuya solución aporte innovación, fama,... además de posibles recompensas si de ello se va a obtener beneficio. Un ejemplo de lo que debería ser es Bounty Source (https://www.bountysource.com/): busca un reto, resuélvelo, y reclama tu recompensa. Otro ejemplo, bastante distinto, sería la web Kaggle (http://www.kaggle.com/competitions) dedicada a soluciones de bigdata (sería otro nivel muy superior). > > Saludos > > -- > monoBOT > Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From glez_b en comunidad.unam.mx Sat Oct 19 02:50:27 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Sat, 19 Oct 2013 00:50:27 +0000 Subject: [Python-es] Redondear numeros y formatear salida Message-ID: <0caf4048608f4d0d9bd420b1aea10b25@CO1PR07MB316.namprd07.prod.outlook.com> Tengo una base de datos mensual y los datos diarios est?n cada 15 minutos. Desarroll? un script para calcular el promedio y suma de algunas variables. Los datos tienen la siguiente estructura: MagViento, DirViento, u, v, Humedad, Precipitacion 5.67, 245 , 7.7898, 6.5660, 100, 4.1 Cuando corro el script, obtengo la siguiente salida: Fecha DirRes Humedad MagRes PreciAcu Temperatura 2011/07/01 141.058824 100.000000 4.647059 30.4 21.367059 2011/07/02 153.823529 99.823529 3.470588 18.0 21.841765 2011/07/03 133.882353 99.823529 4.647059 4.0 21.347059 Ahora deseo guardar la salida a un archivo csv, pero me gustaria que las columnas fueran redondeadas a 1, por ejemplo: 153.823529 = 153.8. Despues de esto, deseo convertir las columnas DirRes y Humedad a un numero entero y MagRes, PreciAcu y Temperatura se queden como float Como puedo lograr esto en pandas o de alguna otra manera? ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From oscar.carballal en gmail.com Sat Oct 19 04:35:24 2013 From: oscar.carballal en gmail.com (Oscar Carballal) Date: Sat, 19 Oct 2013 04:35:24 +0200 Subject: [Python-es] Redondear numeros y formatear salida In-Reply-To: <0caf4048608f4d0d9bd420b1aea10b25@CO1PR07MB316.namprd07.prod.outlook.com> References: <0caf4048608f4d0d9bd420b1aea10b25@CO1PR07MB316.namprd07.prod.outlook.com> Message-ID: Echale un vistazo a http://docs.python.org/2/library/functions.html#round :) Regards, Oscar -- Oscar Carballal Prego Software developer oscar.carballal en gmail.com El 19 de octubre de 2013 02:50, Boris Vladimir Comi < glez_b en comunidad.unam.mx> escribió: > Tengo una base de datos mensual y los datos diarios están cada 15 > minutos. Desarrollé un script para calcular el promedio y suma de algunas > variables. Los datos tienen la siguiente estructura: > > > MagViento, DirViento, u, v, Humedad, Precipitacion > 5.67, 245 , 7.7898, 6.5660, 100, 4.1 > > > Cuando corro el script, obtengo la siguiente salida: > > Fecha DirRes Humedad MagRes PreciAcu Temperatura > > 2011/07/01 141.058824 100.000000 4.647059 30.4 21.367059 > 2011/07/02 153.823529 99.823529 3.470588 18.0 21.841765 > 2011/07/03 133.882353 99.823529 4.647059 4.0 21.347059 > > > Ahora deseo guardar la salida a un archivo csv, pero me gustaria que las > columnas fueran redondeadas a 1, por ejemplo: 153.823529 = 153.8. Despues > de esto, deseo convertir las columnas > DirRes y Humedad a un numero entero y > MagRes, PreciAcu y Temperatura se queden como float > > > Como puedo lograr esto en pandas o de alguna otra manera? > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nachoel01 en gmail.com Sat Oct 19 11:35:06 2013 From: nachoel01 en gmail.com (=?UTF-8?Q?Ignacio_Rodr=C3=ADguez?=) Date: Sat, 19 Oct 2013 07:35:06 -0200 Subject: [Python-es] =?utf-8?q?=5Bpygtk=5D_pinchar_el_rat=C3=B3n_no_funcio?= =?utf-8?q?na?= In-Reply-To: <5260373A.3090902@web.de> References: <5260373A.3090902@web.de> Message-ID: Agrega esto: *self.win.connect('button-press-event', self.button_press_event)* Despues de esto: *self.win.add_events(gtk.gdk.BUTTON_PRESS_MASK) * (¿Eso es necesario?, Creo que no hace falta) Saludos. Ignacio Rodríguez 2013/10/17 Pablo Rodríguez > Hola a todas y todos, > > tengo un pequeño programilla del que ni me acuerdo cómo escribí. (El > ejemplo está abajo.) > > Todo funciona, pero necesito implementar "button_press_event()". Me temo > que no tira de ningún modo. > > De lo que sé (que es muy poco), debería funcionar. > > ¿Alguien sería tan amable de indicarme el error? > > Sé que es una cuestión específica de PyGTK. Hace tres meses que lo he > preguntado en la lista y no he tenido respuesta. > > Agradecería mucho vuestra ayuda. > > Saludos, > > > Pablo > > > import gnomevfs > import gtk > import pygtk > try: > import poppler > except: > print "poppler is not available" > import sys > import cairo > import gtk.glade > > class rec_presentation: > def __init__(self): > > uri = gnomevfs.make_uri_from_shell_arg(sys.argv[1]) > > self.filename = sys.argv[1] > > self.document = poppler.document_new_from_file (uri, None) > self.n_pages = self.document.get_n_pages() > self.page_selector = self.document.get_page(0) > self.current_page = 0 > > self.gui = gtk.glade.XML("recslides.glade","mainwindow", > domain="recslides") > self.win = self.gui.get_widget("mainwindow") > self.area = self.gui.get_widget("pdfdocument_area") > self.gui.signal_autoconnect(self) > self.win.add_events(gtk.gdk.BUTTON_PRESS_MASK) > > self.width, self.height = self.win.get_size() > self.page_width, self.page_height= self.page_selector.get_size() > > self.surface = cairo.ImageSurface(cairo.FORMAT_RGB24, > int(self.width), > int(self.height)) > > black = gtk.gdk.color_parse("black") > self.area.modify_bg(gtk.STATE_NORMAL, black) > self.area.set_size_request(int(self.width), int(self.height)) > > self.win.show_all() > > def button_press_event(self, widget, event): > if event.button == 1: > print 'Clicked at x={0}, y={0}'.format(event.x, event.y) > > self.win.connect('button-press-event', button_press_event) > > def on_expose_event(self, widget, event): > add_x = 0 > add_y = 0 > > if (self.area.allocation.width/self.page_width) < > (self.area.allocation.height/self.page_height): > self.scale = self.area.allocation.width/self.page_width > else: > self.scale = self.area.allocation.height/self.page_height > > if (self.area.allocation.width/self.page_width) > > (self.area.allocation.height/self.page_height): > add_x= > > int(((self.area.allocation.width-(self.page_width*self.scale))/2)/self.scale) > else: > add_y= > > int(((self.area.allocation.height-(self.page_height*self.scale))/2)/self.scale) > > cr = widget.window.cairo_create() > cr.set_source_surface(self.surface) > cr.set_source_rgb(1, 1, 1) > > if self.scale != 1: > cr.scale(self.scale, self.scale) > > cr.translate(add_x, add_y) > cr.rectangle(0, 0, self.page_width, self.page_height) > cr.fill() > self.page_selector.render(cr) > > def gtk_main_quit(self, widget, event): > gtk.main_quit() > > def main(self): > gtk.main() > > > rec = rec_presentation() > rec.main() > > -- > http://www.ousia.tk > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From monobot.soft en gmail.com Sat Oct 19 11:44:54 2013 From: monobot.soft en gmail.com (monoBOT) Date: Sat, 19 Oct 2013 10:44:54 +0100 Subject: [Python-es] que os parece el sitio http://www.codersclan.net/ In-Reply-To: <5261A9D2.5060804@mundo-r.com> References: <5261A9D2.5060804@mundo-r.com> Message-ID: El 18 de octubre de 2013 22:36, Julio S.G. escribió: > Primero, la tajada debe estar en tu mente. ¿Como era? Piensa el ladrón que > son todos de su condición. > Ahora entiendo a los que están cansados. Perdóname, si me he pasado, pero > ya llega de analizarle y programarle el tema a nadie. Un poco de interés y > trabajo de los que preguntan no estaría mal. > Cuanto odio, sólo he preguntado cual era vuestra opinion y te lo has tomado muy mal. Me has llamado ladrón y no me conoces, Háztelo mirar, debes tener un problema de ira o algo. Bueno paz. -- *monoBOT* Visite mi sitio(Visit my site): monobotblog.alvarezalonso.es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From juanlu001 en gmail.com Sat Oct 19 11:50:19 2013 From: juanlu001 en gmail.com (Juan Luis Cano) Date: Sat, 19 Oct 2013 11:50:19 +0200 Subject: [Python-es] =?iso-8859-1?q?Lista_de_libros_de_programaci=F3n_libr?= =?iso-8859-1?q?es/gratuitos?= In-Reply-To: References: Message-ID: <526255DB.4080104@gmail.com> On 10/17/2013 12:47 AM, Carlos Zuniga wrote: > Siempre hay quienes vienen a la lista buscando libros para leer online > o descargar, aquí hay una recopilación de todos ellos: > > https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#python > > Si conocen otros, no duden en mandar su pull-request ;) > > > Saludos Aquí tienen una lista con descripciones, filtros por idiomas, categorías, valoraciones de los usuarios y más: http://www.etnassoft.com/biblioteca/?search_term=python&books_category=all&books_criteria=post_date_DESC&lang=spanish&since=all Si no conocían aún Openlibra, se la presento :) From juanlu001 en gmail.com Sat Oct 19 11:56:57 2013 From: juanlu001 en gmail.com (Juan Luis Cano) Date: Sat, 19 Oct 2013 11:56:57 +0200 Subject: [Python-es] Redondear numeros y formatear salida In-Reply-To: <0caf4048608f4d0d9bd420b1aea10b25@CO1PR07MB316.namprd07.prod.outlook.com> References: <0caf4048608f4d0d9bd420b1aea10b25@CO1PR07MB316.namprd07.prod.outlook.com> Message-ID: <52625769.7050309@gmail.com> On 10/19/2013 02:50 AM, Boris Vladimir Comi wrote: > Tengo una base de datos mensual y los datos diarios están cada 15 > minutos. Desarrollé un script para calcular el promedio y suma de > algunas variables. Los datos tienen la siguiente estructura: > > > MagViento, DirViento, u, v, Humedad, Precipitacion > 5.67, 245 , 7.7898, 6.5660, 100, 4.1 > > > Cuando corro el script, obtengo la siguiente salida: > > Fecha DirRes Humedad MagRes PreciAcu Temperatura > > 2011/07/01 141.058824 100.000000 4.647059 30.4 21.367059 > 2011/07/02 153.823529 99.823529 3.470588 18.0 21.841765 > 2011/07/03 133.882353 99.823529 4.647059 4.0 21.347059 > > > > Ahora deseo guardar la salida a un archivo csv, pero me gustaria que > las columnas fueran redondeadas a 1, por ejemplo: 153.823529 = 153.8. > Despues de esto, deseo convertir las columnas > DirRes y Humedad a un numero entero y > MagRes, PreciAcu y Temperatura se queden como float > > > Como puedo lograr esto en pandas o de alguna otra manera? Puedes utilizar el método `.to_csv` del objeto DataFrame con el parámetro `float_format`, que acepta una función: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html en tu caso sería algo así como: df.to_csv('data.csv', float_format='{0:.1f}'.format) Mira a ver si así te funciona. Juanlu > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From oinos en web.de Sun Oct 20 12:45:16 2013 From: oinos en web.de (=?ISO-8859-1?Q?Pablo_Rodr=EDguez?=) Date: Sun, 20 Oct 2013 12:45:16 +0200 Subject: [Python-es] =?iso-8859-1?q?=5Bpygtk=5D_pinchar_el_rat=F3n_no_func?= =?iso-8859-1?q?iona?= In-Reply-To: References: <5260373A.3090902@web.de> Message-ID: <5263B43C.70302@web.de> On 10/19/2013 11:35 AM, Ignacio Rodríguez wrote: > Agrega esto: > self.win.connect('button-press-event', self.button_press_event) > Despues de esto: > self.win.add_events(gtk.gdk.BUTTON_PRESS_MASK) > (¿Eso es necesario?, Creo que no hace falta) Muchas gracias de veras, Ignacio. Ahora funciona perfectamente. La segunda línea que dices es necesaria, sino no me funciona (no sé por qué). Saludos, Pablo -- http://www.ousia.tk From riello57 en gmail.com Sun Oct 20 13:46:54 2013 From: riello57 en gmail.com (Fernando Garcia) Date: Sun, 20 Oct 2013 13:46:54 +0200 Subject: [Python-es] Conflicto python-exe Message-ID: Estoy escribiendo una aplicación para gestionar una base de datos con el personal de una empresa. Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y acentos (lo que se llama normalizar texto, vamos) debo convertir cada linea de string a unicode. Haciéndolo así, la aplicación funciona correctamente, ningún problema... siempre que se ejecute desde el código fuente. Desde el intérprete de python, vamos. Pero cuando convierto la aplicación a un ejecutable .exe para su distribución, me da un error, localizado en la linea donde convierto la bd a unicode: el típico ordinal not i range, etc, etc... ¿Alguien sabe porqué ocurre esto y como se puede solucionar? ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nadaird en gmail.com Mon Oct 21 00:43:26 2013 From: nadaird en gmail.com (Guillermo Vaya) Date: Mon, 21 Oct 2013 00:43:26 +0200 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Creo que sería más fácil ayudarte si pegas el trozo de código donde se genera el error (Con la cantidad suficiente como para poder ver donde inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo error. Te recomiendo usar algún tipo de pastebin, para facilitar la lectura de código. Además, deberías pegar el error concreto, que no cuesta mucho y da más información. Un saludo 2013/10/20 Fernando Garcia > Estoy escribiendo una aplicación para gestionar una base de datos con el > personal de una empresa. > Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y > acentos (lo que se llama normalizar texto, vamos) debo convertir cada linea > de string a unicode. Haciéndolo así, la aplicación funciona correctamente, > ningún problema... siempre que se ejecute desde el código fuente. Desde el > intérprete de python, vamos. > Pero cuando convierto la aplicación a un ejecutable .exe para su > distribución, me da un error, localizado en la linea donde convierto la bd > a unicode: el típico ordinal not i range, etc, etc... > ¿Alguien sabe porqué ocurre esto y como se puede solucionar? > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From ricardo.cardenes en gmail.com Mon Oct 21 10:53:52 2013 From: ricardo.cardenes en gmail.com (=?ISO-8859-1?Q?Ricardo_C=E1rdenes?=) Date: Mon, 21 Oct 2013 09:53:52 +0100 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino de la configuración de Python. Si te dice que blahblah es un ordinal que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en tu Python normal, es bastante probable que hayas modificado el site.py de tu máquina para que la codificación por defecto sea otra que no la ASCII. Y también muy probable que al construir el .EXE, éste no se lleve una copia de tu site.py (lógico, por otra parte), así que ese cambio no queda reflejado. Si ése es el caso, hay dos maneras de corregirlo: la complicada pero *recomendada*, que es poner tu site.py de vuelta como estaba y corregir el programa para que funcione correctamente en cualquier entorno. La sencilla pero *chapuza* es buscar la manera (no la conozco) de que el site.py (o equivalente) que va en el .EXE vaya modificado... o cambiarlo al vuelo al arrancar el programa, pero creo que para ese momento ya es tarde. Saludos, Ricardo 2013/10/20 Guillermo Vaya : > Creo que sería más fácil ayudarte si pegas el trozo de código donde se > genera el error (Con la cantidad suficiente como para poder ver donde > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo error. > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura de > código. > > Además, deberías pegar el error concreto, que no cuesta mucho y da más > información. > > Un saludo > > > 2013/10/20 Fernando Garcia >> >> Estoy escribiendo una aplicación para gestionar una base de datos con el >> personal de una empresa. >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada linea >> de string a unicode. Haciéndolo así, la aplicación funciona correctamente, >> ningún problema... siempre que se ejecute desde el código fuente. Desde el >> intérprete de python, vamos. >> Pero cuando convierto la aplicación a un ejecutable .exe para su >> distribución, me da un error, localizado en la linea donde convierto la bd a >> unicode: el típico ordinal not i range, etc, etc... >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > From riello57 en gmail.com Mon Oct 21 10:09:09 2013 From: riello57 en gmail.com (Fernando Garcia) Date: Mon, 21 Oct 2013 10:09:09 +0200 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Te explico: De entrada, he cambiado la codificación por defecto para que me admita acentos en la caja de búsqueda: # -*- coding: iso-8859-1 -*- Estos son los módulos que importo: from Tkinter import* from PIL import Image, ImageTk import tkFont import unicodedata from unicodedata import normalize import codecs Y esta es la parte del código donde da el error: def ventanaSalidaDatos(): with open("PersonalCGPJ.txt","a")as PersonalCGPJ: nombre=StringVar() nombre=texto.get() archivo=open("PersonalCGPJ.txt", "r") #archivo=codecs.open("PersonalCGPJ.txt","r", encoding='iso-8859-1') root.withdraw() ventanaSalidaDatos=Toplevel(root) w,h=ventanaSalidaDatos.maxsize() ancho=0.9*w alto=0.5*h centrarVentana(ventanaSalidaDatos, ancho, alto) botonFinalizar(ventanaSalidaDatos) botonVolver(root, ventanaSalidaDatos) ventanaSalidaDatos.title(nombre) ventanaSalidaDatos.config(bg="skyblue") ventanaSalidaDatos.resizable(0,0) datos=[] for linea in archivo.readlines(): (*)linea=unicode(linea) (*)nombre=unicode(nombre) pronombre=normalize('NFKD', unicode(nombre)).encode('ASCII', 'ignore')#esta linea y la siguiente... prolinea=normalize('NFKD', unicode(linea)).encode('ASCII', 'ignore')#...arreglan los acentos. nombre=nombre.title()#esta linea convierte a mayúscula la primera letra de la búsqueda introducida por el usuario. if pronombre in prolinea or nombre in prolinea: datos.append(linea) n=len(datos) if n==0: etiqueta1=Label(ventanaSalidaDatos, text=nombre+":", font=fuente2, bg="skyblue", fg="brown").pack(side=TOP, anchor="nw") etiqueta2=Label(ventanaSalidaDatos, text="No hay datos para esta entrada. Por favor, revise la ortografía", font=fuente3, bg="skyblue", justify=LEFT).pack() else: entrada.delete(0,END) lista=Listbox(ventanaSalidaDatos, height=n) scrollbar=Scrollbar(lista, orient=VERTICAL) scrollbar.config(command=lista.yview) lista.config(font=fuente3, fg="white", bg="royalblue", yscrollcommand=scrollbar.set) for dato in datos: lista.insert(END, dato) scrollbar.pack(side=RIGHT, fill=BOTH, expand=YES) lista.pack(fill=BOTH, expand=YES) Espero que se entienda. Quiero aclarar que cuando corro la aplicación desde el IDLE de Python, funciona perfectamente. Hace las busquedas estupendamente, indiferente a mayúsculas, minúsculas y acentos. También admite acentos en la caja de búsqueda. Aunque es innecesario, si a un usuario le da por meter un acento, evito que de error. Entonces decido pasar la aplicación a un ejecutable para distribuirla, utilizando este archivo setup.py: try: from distutils.core import setup import py2exe from modulefinder import Module import glob, fnmatch import sys, os, shutil import operator except ImportError, message: raise SystemExit, "Imposible cargar módulo. %s" % message setup( windows = [{"script":"Personal.pyw"}], project_name = "Personal", project_version = "0.1", license = "mi aplicacion", author_name = "FGarcia", author_email = "riello57 en gmail", description = "Aplicación de todo el personal de la empresa", icon_file = "icon.ico", data_files = [(".", ["Personal.txt", "escudo.gif", "icon.ico"])], extra_modules = ["Tkinter", "PIL", "Image", "ImageTk", "tkFont", "unicodedata", "codecs"], dist_dir ='dist' ) Utilizo py2exe para hacer el ejecutable. Todo procede normalmente, pero cuando quiero arrancar la aplicación desde el ejecutable, me da error en la línea del programa marcada con un asterisco: (*)linea=unicode(linea) El error es mas o menos así: UnicodeDecodeError: ascii, codec cant't decode byte 0xef in position 52: ordinal not in range(128) No se lo que puede ser. Python no me pone ninguna pega cuando la hago correr desde el código fuente. Pero desde el ejecutable no lo admite. ¿Alguna idea?. Gracias. El 21 de octubre de 2013 00:43, Guillermo Vaya escribió: > Creo que sería más fácil ayudarte si pegas el trozo de código donde se > genera el error (Con la cantidad suficiente como para poder ver donde > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo > error. Te recomiendo usar algún tipo de pastebin, para facilitar la lectura > de código. > > Además, deberías pegar el error concreto, que no cuesta mucho y da más > información. > > Un saludo > > > 2013/10/20 Fernando Garcia > >> Estoy escribiendo una aplicación para gestionar una base de datos con el >> personal de una empresa. >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada linea >> de string a unicode. Haciéndolo así, la aplicación funciona correctamente, >> ningún problema... siempre que se ejecute desde el código fuente. Desde el >> intérprete de python, vamos. >> Pero cuando convierto la aplicación a un ejecutable .exe para su >> distribución, me da un error, localizado en la linea donde convierto la bd >> a unicode: el típico ordinal not i range, etc, etc... >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From riello57 en gmail.com Mon Oct 21 11:00:03 2013 From: riello57 en gmail.com (Fernando Garcia) Date: Mon, 21 Oct 2013 11:00:03 +0200 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Cierto, he cambiado la configuración por defecto de Python, incluyendo en la carpeta site.packages un archivo donde se cambia la codificación por defecto de asciia iso-8859-1. Es la única manera que conozco de que el programa me admita incluir acentos en las búsquedas. Si conoces alguna otra forma, por favor indícamelo y de esa forma podré restituir la configuración a su estado inicial, sin merma de su eficacia. Gracias El 21 de octubre de 2013 10:53, Ricardo Cárdenes escribió: > El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino > de la configuración de Python. Si te dice que blahblah es un ordinal > que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en > tu Python normal, es bastante probable que hayas modificado el site.py > de tu máquina para que la codificación por defecto sea otra que no la > ASCII. Y también muy probable que al construir el .EXE, éste no se > lleve una copia de tu site.py (lógico, por otra parte), así que ese > cambio no queda reflejado. > > Si ése es el caso, hay dos maneras de corregirlo: la complicada pero > *recomendada*, que es poner tu site.py de vuelta como estaba y > corregir el programa para que funcione correctamente en cualquier > entorno. La sencilla pero *chapuza* es buscar la manera (no la > conozco) de que el site.py (o equivalente) que va en el .EXE vaya > modificado... o cambiarlo al vuelo al arrancar el programa, pero creo > que para ese momento ya es tarde. > > Saludos, > Ricardo > > 2013/10/20 Guillermo Vaya : > > Creo que sería más fácil ayudarte si pegas el trozo de código donde se > > genera el error (Con la cantidad suficiente como para poder ver donde > > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo > error. > > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura de > > código. > > > > Además, deberías pegar el error concreto, que no cuesta mucho y da más > > información. > > > > Un saludo > > > > > > 2013/10/20 Fernando Garcia > >> > >> Estoy escribiendo una aplicación para gestionar una base de datos con el > >> personal de una empresa. > >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y > >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada > linea > >> de string a unicode. Haciéndolo así, la aplicación funciona > correctamente, > >> ningún problema... siempre que se ejecute desde el código fuente. Desde > el > >> intérprete de python, vamos. > >> Pero cuando convierto la aplicación a un ejecutable .exe para su > >> distribución, me da un error, localizado en la linea donde convierto la > bd a > >> unicode: el típico ordinal not i range, etc, etc... > >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? > >> > >> > >> _______________________________________________ > >> Python-es mailing list > >> Python-es en python.org > >> https://mail.python.org/mailman/listinfo/python-es > >> FAQ: http://python-es-faq.wikidot.com/ > >> > > > > > > _______________________________________________ > > Python-es mailing list > > Python-es en python.org > > https://mail.python.org/mailman/listinfo/python-es > > FAQ: http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kelertxiki en gmail.com Mon Oct 21 15:37:20 2013 From: kelertxiki en gmail.com (Ander Garmendia) Date: Mon, 21 Oct 2013 15:37:20 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= Message-ID: Buenas, estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo una duda que quizá alguien me pueda aclarar. Digamos que tenemos una clase ( llamemosla B ) a la que queremos añadir una funcionalidad (llamemosla F). El método clásico sería heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo normal y corriente. Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos crear una clase decoradora ( llamemosla D ) que implemente la funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B ), añade la funcionalidad F en la clase B sin necesidad de herencias de ningún tipo. Visto así, todo parece muy cómodo, se escribe menos código, hay menos clases implicadas, etc. Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica extendida al escribir código en python ( es pythonico y aceptable ) ? ¿ o es mas una prueba conceptual ? Gracias de antemano y un saludo. Ander. From yeiniel en uclv.cu Mon Oct 21 16:30:22 2013 From: yeiniel en uclv.cu (=?UTF-8?Q?Yeiniel_Su=C3=A1rez_Sosa?=) Date: Mon, 21 Oct 2013 10:30:22 -0400 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: Message-ID: Hola como lo que pregunta es si la práctica está extendida, le voy a responder con mi práctica. Normalmente no creo un decorador para esto. Supongamos que tengo una clase A que ofrece un servicio mi_servicio (un método) y una clase B que desea usar el servicio que ofrece A (no es una herencia, sino una composición). En este caso yo en la clase B escribo una declaración de la misma función con el mismo nombre, los mismos parámetros, las mismas anotaciones (si usas Python 3.x) solo que le pongo en el cuerpo "raise NotImplementedError()" y en la documentación indico que debe ser un método compatible con "A.mi_servicio" fijense que digo compatible, aqui dejo abierta la posibilidad para muchas cosas. De esta forma indico que B consume un servicio pero que no lo implementa esta clase. A la hora de usar B simplemente creo el objeto de la clase B e inyecto una implementación para el método mi_servicio. Codigo de Ejemplo: ################################### class A: def mi_servicio(self): print("servicio que imprime un mensaje en pantalla") class B: def mi_servicio(self): """ Como implementacion de este metodo puede usarse A.mi_servicio o cualquier otro compatible. """ raise NotImplementedError() # luego cuando deseo usar B a = A() b = B() b.mi_servicio = a.mi_servicio ################################## La ultima parte de creación del objeto b e inyección de dependencias lo hago utilizando una librería de inyección de dependencias sencilla de solo dos funciones (inject() y create_descriptor()) En el ejemplo de arriba se asume que mi_servicio es opcional para B, en caso de ser requerido lo adiciono como un argumento de inicialización de la clase B y paso a.mi_servicio como argumento del constructor. Espero comprendas que inyección de dependencias no quiere decir emplear un contenedor, ni una librería, sino dejar bien claro quien requiere algo que lo ofrece otro. Atentamente -- Ing. Yeiniel Suárez Sosa Profesor Instructor, Dep. Automática FIE, UCLV On 2013-10-21 09:37, Ander Garmendia wrote: > Buenas, > > estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo > una duda que quizá alguien me pueda aclarar. > > Digamos que tenemos una clase ( llamemosla B ) a la que queremos > añadir una funcionalidad (llamemosla F). El método clásico sería > heredar desde la clase base ( B ) y crear una nueva clase ( > llamemosla > C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo > normal y corriente. > > Ahora llega python y nos ofrece los decoradores, por lo tanto, > podemos > crear una clase decoradora ( llamemosla D ) que implemente la > funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B > ), añade la funcionalidad F en la clase B sin necesidad de herencias > de ningún tipo. > > Visto así, todo parece muy cómodo, se escribe menos código, hay menos > clases implicadas, etc. > Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta > practica > extendida al escribir código en python ( es pythonico y aceptable ) ? > ¿ o es mas una prueba conceptual ? > > Gracias de antemano y un saludo. > > Ander. > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From jbc.develop en gmail.com Mon Oct 21 17:48:32 2013 From: jbc.develop en gmail.com (Juan BC) Date: Mon, 21 Oct 2013 13:48:32 -0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: Message-ID: setattr(b, "mi_servicio", a.mi_servicio) El día 21 de octubre de 2013 11:30, Yeiniel Suárez Sosa escribió: > Hola > > como lo que pregunta es si la práctica está extendida, le voy a responder > con mi práctica. > Normalmente no creo un decorador para esto. Supongamos que tengo una clase A > que > ofrece un servicio mi_servicio (un método) y una clase B que desea usar el > servicio > que ofrece A (no es una herencia, sino una composición). En este caso yo en > la clase B escribo > una declaración de la misma función con el mismo nombre, los mismos > parámetros, las mismas > anotaciones (si usas Python 3.x) solo que le pongo en el cuerpo "raise > NotImplementedError()" y en la > documentación indico que debe ser un método compatible con "A.mi_servicio" > fijense que digo compatible, aqui dejo > abierta la posibilidad para muchas cosas. > De esta forma indico que B consume un servicio pero que no lo implementa > esta clase. A la hora de usar B simplemente creo > el objeto de la clase B e inyecto una implementación para el método > mi_servicio. > > Codigo de Ejemplo: > ################################### > class A: > def mi_servicio(self): > print("servicio que imprime un mensaje en pantalla") > > class B: > def mi_servicio(self): > """ > Como implementacion de este metodo puede usarse A.mi_servicio o > cualquier otro compatible. > """ > raise NotImplementedError() > > # luego cuando deseo usar B > a = A() > b = B() > b.mi_servicio = a.mi_servicio > ################################## > La ultima parte de creación del objeto b e inyección de dependencias lo hago > utilizando una > librería de inyección de dependencias sencilla de solo dos funciones > (inject() y create_descriptor()) > > En el ejemplo de arriba se asume que mi_servicio es opcional para B, en caso > de ser requerido lo > adiciono como un argumento de inicialización de la clase B y paso > a.mi_servicio como argumento del > constructor. > > Espero comprendas que inyección de dependencias no quiere decir emplear un > contenedor, ni una librería, > sino dejar bien claro quien requiere algo que lo ofrece otro. > > Atentamente > -- > Ing. Yeiniel Suárez Sosa > Profesor Instructor, Dep. Automática > FIE, UCLV > > > On 2013-10-21 09:37, Ander Garmendia wrote: >> >> Buenas, >> >> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >> una duda que quizá alguien me pueda aclarar. >> >> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >> añadir una funcionalidad (llamemosla F). El método clásico sería >> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >> normal y corriente. >> >> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >> crear una clase decoradora ( llamemosla D ) que implemente la >> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >> ), añade la funcionalidad F en la clase B sin necesidad de herencias >> de ningún tipo. >> >> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >> clases implicadas, etc. >> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >> extendida al escribir código en python ( es pythonico y aceptable ) ? >> ¿ o es mas una prueba conceptual ? >> >> Gracias de antemano y un saludo. >> >> Ander. >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Juan B Cabral From ricardo.cardenes en gmail.com Mon Oct 21 17:58:19 2013 From: ricardo.cardenes en gmail.com (=?ISO-8859-1?Q?Ricardo_C=E1rdenes?=) Date: Mon, 21 Oct 2013 16:58:19 +0100 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: En las líneas que te da el fallo: (*)linea=unicode(linea) (*)nombre=unicode(nombre) estás pidiéndole a Python que convierta "linea" y "nombre", que son cadenas normales (asumimos que esto es Python2.x, claro) en cadenas de tipo Unicode. Hay un problema aquí y es que claro, Python no sabe qué codificación tienen las cadenas originales y lo que hará es usar la codificación por defecto (que es lo que has modificado en el paquete "site"). Pero lo puedes especificar: CODIFICACION="iso-8859-1" [...] linea=unicode(linea, CODIFICACION) nombre=unicode(nombre, CODIFICACION) [...] haciendo eso debería de desaparecer el error. 2013/10/21 Fernando Garcia : > Cierto, he cambiado la configuración por defecto de Python, incluyendo en la > carpeta site.packages un archivo donde se cambia la codificación por defecto > de asciia iso-8859-1. Es la única manera que conozco de que el programa me > admita incluir acentos en las búsquedas. Si conoces alguna otra forma, por > favor indícamelo y de esa forma podré restituir la configuración a su estado > inicial, sin merma de su eficacia. Gracias > > > El 21 de octubre de 2013 10:53, Ricardo Cárdenes > escribió: > >> El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino >> de la configuración de Python. Si te dice que blahblah es un ordinal >> que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en >> tu Python normal, es bastante probable que hayas modificado el site.py >> de tu máquina para que la codificación por defecto sea otra que no la >> ASCII. Y también muy probable que al construir el .EXE, éste no se >> lleve una copia de tu site.py (lógico, por otra parte), así que ese >> cambio no queda reflejado. >> >> Si ése es el caso, hay dos maneras de corregirlo: la complicada pero >> *recomendada*, que es poner tu site.py de vuelta como estaba y >> corregir el programa para que funcione correctamente en cualquier >> entorno. La sencilla pero *chapuza* es buscar la manera (no la >> conozco) de que el site.py (o equivalente) que va en el .EXE vaya >> modificado... o cambiarlo al vuelo al arrancar el programa, pero creo >> que para ese momento ya es tarde. >> >> Saludos, >> Ricardo >> >> 2013/10/20 Guillermo Vaya : >> > Creo que sería más fácil ayudarte si pegas el trozo de código donde se >> > genera el error (Con la cantidad suficiente como para poder ver donde >> > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo >> > error. >> > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura de >> > código. >> > >> > Además, deberías pegar el error concreto, que no cuesta mucho y da más >> > información. >> > >> > Un saludo >> > >> > >> > 2013/10/20 Fernando Garcia >> >> >> >> Estoy escribiendo una aplicación para gestionar una base de datos con >> >> el >> >> personal de una empresa. >> >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y >> >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada >> >> linea >> >> de string a unicode. Haciéndolo así, la aplicación funciona >> >> correctamente, >> >> ningún problema... siempre que se ejecute desde el código fuente. Desde >> >> el >> >> intérprete de python, vamos. >> >> Pero cuando convierto la aplicación a un ejecutable .exe para su >> >> distribución, me da un error, localizado en la linea donde convierto la >> >> bd a >> >> unicode: el típico ordinal not i range, etc, etc... >> >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? >> >> >> >> >> >> _______________________________________________ >> >> Python-es mailing list >> >> Python-es en python.org >> >> https://mail.python.org/mailman/listinfo/python-es >> >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> > >> > >> > _______________________________________________ >> > Python-es mailing list >> > Python-es en python.org >> > https://mail.python.org/mailman/listinfo/python-es >> > FAQ: http://python-es-faq.wikidot.com/ >> > >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > From ricardo.cardenes en gmail.com Mon Oct 21 18:02:06 2013 From: ricardo.cardenes en gmail.com (=?ISO-8859-1?Q?Ricardo_C=E1rdenes?=) Date: Mon, 21 Oct 2013 17:02:06 +0100 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Se me olvidaba: esto es asumiendo que tu codificación sea ISO-8859-1, claro. Si estás usando Windows lo más probable es que la codificación sea Windows-1252; en otros lo más normal es UTF-8. El problema es que la codificación no es algo que puedas predecir a menos que tengas previsto o bajo control las máquinas en las que se va a ejecutar tu código. En cualquier caso, quizá prefieras poner esto en un fichero de configuración o como opción a escoger en algún menú del programa. Saludos, Ricardo 2013/10/21 Ricardo Cárdenes : > En las líneas que te da el fallo: > > (*)linea=unicode(linea) > (*)nombre=unicode(nombre) > > estás pidiéndole a Python que convierta "linea" y "nombre", que son > cadenas normales (asumimos que esto es Python2.x, claro) en cadenas de > tipo Unicode. Hay un problema aquí y es que claro, Python no sabe qué > codificación tienen las cadenas originales y lo que hará es usar la > codificación por defecto (que es lo que has modificado en el paquete > "site"). > > Pero lo puedes especificar: > > CODIFICACION="iso-8859-1" > [...] > linea=unicode(linea, CODIFICACION) > nombre=unicode(nombre, CODIFICACION) > [...] > > haciendo eso debería de desaparecer el error. > > > > 2013/10/21 Fernando Garcia : >> Cierto, he cambiado la configuración por defecto de Python, incluyendo en la >> carpeta site.packages un archivo donde se cambia la codificación por defecto >> de asciia iso-8859-1. Es la única manera que conozco de que el programa me >> admita incluir acentos en las búsquedas. Si conoces alguna otra forma, por >> favor indícamelo y de esa forma podré restituir la configuración a su estado >> inicial, sin merma de su eficacia. Gracias >> >> >> El 21 de octubre de 2013 10:53, Ricardo Cárdenes >> escribió: >> >>> El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino >>> de la configuración de Python. Si te dice que blahblah es un ordinal >>> que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en >>> tu Python normal, es bastante probable que hayas modificado el site.py >>> de tu máquina para que la codificación por defecto sea otra que no la >>> ASCII. Y también muy probable que al construir el .EXE, éste no se >>> lleve una copia de tu site.py (lógico, por otra parte), así que ese >>> cambio no queda reflejado. >>> >>> Si ése es el caso, hay dos maneras de corregirlo: la complicada pero >>> *recomendada*, que es poner tu site.py de vuelta como estaba y >>> corregir el programa para que funcione correctamente en cualquier >>> entorno. La sencilla pero *chapuza* es buscar la manera (no la >>> conozco) de que el site.py (o equivalente) que va en el .EXE vaya >>> modificado... o cambiarlo al vuelo al arrancar el programa, pero creo >>> que para ese momento ya es tarde. >>> >>> Saludos, >>> Ricardo >>> >>> 2013/10/20 Guillermo Vaya : >>> > Creo que sería más fácil ayudarte si pegas el trozo de código donde se >>> > genera el error (Con la cantidad suficiente como para poder ver donde >>> > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo >>> > error. >>> > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura de >>> > código. >>> > >>> > Además, deberías pegar el error concreto, que no cuesta mucho y da más >>> > información. >>> > >>> > Un saludo >>> > >>> > >>> > 2013/10/20 Fernando Garcia >>> >> >>> >> Estoy escribiendo una aplicación para gestionar una base de datos con >>> >> el >>> >> personal de una empresa. >>> >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas y >>> >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada >>> >> linea >>> >> de string a unicode. Haciéndolo así, la aplicación funciona >>> >> correctamente, >>> >> ningún problema... siempre que se ejecute desde el código fuente. Desde >>> >> el >>> >> intérprete de python, vamos. >>> >> Pero cuando convierto la aplicación a un ejecutable .exe para su >>> >> distribución, me da un error, localizado en la linea donde convierto la >>> >> bd a >>> >> unicode: el típico ordinal not i range, etc, etc... >>> >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? >>> >> >>> >> >>> >> _______________________________________________ >>> >> Python-es mailing list >>> >> Python-es en python.org >>> >> https://mail.python.org/mailman/listinfo/python-es >>> >> FAQ: http://python-es-faq.wikidot.com/ >>> >> >>> > >>> > >>> > _______________________________________________ >>> > Python-es mailing list >>> > Python-es en python.org >>> > https://mail.python.org/mailman/listinfo/python-es >>> > FAQ: http://python-es-faq.wikidot.com/ >>> > >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> From sergio en wikier.org Mon Oct 21 18:05:06 2013 From: sergio en wikier.org (=?UTF-8?Q?Sergio_Fern=C3=A1ndez?=) Date: Mon, 21 Oct 2013 18:05:06 +0200 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: Message-ID: A ese respecto, hay un detalle que me parece interesante comentar. Quizá sea un detalle que parezca irrelevante, pero creo que es interesante comprender bien como funciona internamente el api de reflectividad en python si uno no se quiere topar con errores a los que no se les es capaz de encontrar el sentido. Y lo digo por experiencia ;-) En python, cuando se le pide un atributo/método a un objeto, en realidad el método __getattr__ es el encargado de buscarlo, bien en el propio objeto instancia o en su jerarquía de clases. Este método devuelve el atributo (o método) si lo encuentra, o lanza una excepción AttributeError. Para evitar llamadas recursivas y provocar errores en caso de no encontrarse, el modelo reflectivo presenta una asimetría entre __getattr__ y __setattr__: * __getattr__ no se llama si el atributo no se encuentra por las vías convencionales * para tener control total sobre la operación es necesario recurrir al método __getattribute__ y así evitar esos problemas de recursividad infinita; este método siempre debe invocar el método de la clase base. No sé cual es el problema concreto que necesita resolve Ander, pero esta es mi receta para tener control total en entornos con uso extensivo de la reflectividad unido a jerárquias complejas de clases: obj.__dict__[?__setattr__?] = MethodType(set_func, obj, obj.__class__) obj.__dict__[?__getattribute__?] = MethodType(get_func, obj, obj.__class__) Puede parece una manera un tanto enrevesada en lugar de usar el simple built-in setattr(), pero hay situaciones que exigen tal tratamiento. Al menos python lo permite, tratar de hacer eso con java.lang.reflection xD 2013/10/21 Juan BC : > setattr(b, "mi_servicio", a.mi_servicio) > > El día 21 de octubre de 2013 11:30, Yeiniel Suárez Sosa > escribió: >> Hola >> >> como lo que pregunta es si la práctica está extendida, le voy a responder >> con mi práctica. >> Normalmente no creo un decorador para esto. Supongamos que tengo una clase A >> que >> ofrece un servicio mi_servicio (un método) y una clase B que desea usar el >> servicio >> que ofrece A (no es una herencia, sino una composición). En este caso yo en >> la clase B escribo >> una declaración de la misma función con el mismo nombre, los mismos >> parámetros, las mismas >> anotaciones (si usas Python 3.x) solo que le pongo en el cuerpo "raise >> NotImplementedError()" y en la >> documentación indico que debe ser un método compatible con "A.mi_servicio" >> fijense que digo compatible, aqui dejo >> abierta la posibilidad para muchas cosas. >> De esta forma indico que B consume un servicio pero que no lo implementa >> esta clase. A la hora de usar B simplemente creo >> el objeto de la clase B e inyecto una implementación para el método >> mi_servicio. >> >> Codigo de Ejemplo: >> ################################### >> class A: >> def mi_servicio(self): >> print("servicio que imprime un mensaje en pantalla") >> >> class B: >> def mi_servicio(self): >> """ >> Como implementacion de este metodo puede usarse A.mi_servicio o >> cualquier otro compatible. >> """ >> raise NotImplementedError() >> >> # luego cuando deseo usar B >> a = A() >> b = B() >> b.mi_servicio = a.mi_servicio >> ################################## >> La ultima parte de creación del objeto b e inyección de dependencias lo hago >> utilizando una >> librería de inyección de dependencias sencilla de solo dos funciones >> (inject() y create_descriptor()) >> >> En el ejemplo de arriba se asume que mi_servicio es opcional para B, en caso >> de ser requerido lo >> adiciono como un argumento de inicialización de la clase B y paso >> a.mi_servicio como argumento del >> constructor. >> >> Espero comprendas que inyección de dependencias no quiere decir emplear un >> contenedor, ni una librería, >> sino dejar bien claro quien requiere algo que lo ofrece otro. >> >> Atentamente >> -- >> Ing. Yeiniel Suárez Sosa >> Profesor Instructor, Dep. Automática >> FIE, UCLV >> >> >> On 2013-10-21 09:37, Ander Garmendia wrote: >>> >>> Buenas, >>> >>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >>> una duda que quizá alguien me pueda aclarar. >>> >>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>> añadir una funcionalidad (llamemosla F). El método clásico sería >>> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>> normal y corriente. >>> >>> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >>> crear una clase decoradora ( llamemosla D ) que implemente la >>> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >>> ), añade la funcionalidad F en la clase B sin necesidad de herencias >>> de ningún tipo. >>> >>> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >>> clases implicadas, etc. >>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >>> extendida al escribir código en python ( es pythonico y aceptable ) ? >>> ¿ o es mas una prueba conceptual ? >>> >>> Gracias de antemano y un saludo. >>> >>> Ander. >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > -- > Juan B Cabral > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Sergio Fernández From txema en nabla.net Mon Oct 21 18:48:17 2013 From: txema en nabla.net (Txema Vicente) Date: Mon, 21 Oct 2013 18:48:17 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: Message-ID: <52655AD1.5040401@nabla.net> Buenas. Aunque puedas usar decoradores para ampliar la clase que decoran, yo no veo los decoradores como sustitutos de la herencia, ni ninguna reduccion de codigo. No necesitas decoradores para hacer eso, puedes asignar una funcion a un atributo de la clase (B.F = F). Ademas, como te pongas a crear clases decoradas que se amplian en ejecucion, a ver como lo explicas luego. Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que van a manejar algo, como funciones que van a tratar los eventos de un GUI, o responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras hacer, sera con una funcion o con una clase, con argumentos o sin ellos. Tambien tienes el decorador @classmethod por si quieres crear clases que puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar como "factoria" de clases. Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de organizacion de API. La herencia es algo claro y maravilloso que te permite organizar las cosas. El decorador es un "atajo del idioma" para trastear con las funciones, no hay nada que realmente no puedas hacer sin usarlo. El 21/10/2013 15:37, Ander Garmendia escribió: > Buenas, > > estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo > una duda que quizá alguien me pueda aclarar. > > Digamos que tenemos una clase ( llamemosla B ) a la que queremos > añadir una funcionalidad (llamemosla F). El método clásico sería > heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla > C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo > normal y corriente. > > Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos > crear una clase decoradora ( llamemosla D ) que implemente la > funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B > ), añade la funcionalidad F en la clase B sin necesidad de herencias > de ningún tipo. > > Visto así, todo parece muy cómodo, se escribe menos código, hay menos > clases implicadas, etc. > Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica > extendida al escribir código en python ( es pythonico y aceptable ) ? > ¿ o es mas una prueba conceptual ? > > Gracias de antemano y un saludo. > > Ander. > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From glez_b en comunidad.unam.mx Mon Oct 21 21:34:12 2013 From: glez_b en comunidad.unam.mx (Boris Vladimir Comi) Date: Mon, 21 Oct 2013 19:34:12 +0000 Subject: [Python-es] Realizar operaciones estadisticas en python Message-ID: <9e2ea4686d594a68a6756028f3944613@CO1PR07MB316.namprd07.prod.outlook.com> El siguiente c?digo intenta calcular el promedio resultante de la direcci?n y magnitud del viento, as? como promedios diarios de temperatura, humedad y la suma diaria de la precipitaci?n. Mi base de datos mensual tiene las siguientes columnas: data Fecha Hora DirViento MagViento Temperatura Humedad PreciAcu 0 2011/07/01 00:00 318 6.6 21.22 100 1.7 1 2011/07/01 00:15 342 5.5 21.20 100 1.7 2 2011/07/01 00:30 329 6.6 21.15 100 4.8 3 2011/07/01 00:45 279 7.5 21.11 100 4.2 4 2011/07/01 01:00 318 6.0 21.16 100 2.5 Lo primero que hago es convertir a radianes la columna DirViento dir_rad=[] for i in range(0, len(data['DirViento'])): dir_rad.append(data['DirViento'][i]*(pi/180.0)) data['DirViento']=around(dir_rad,1) Ahora obtengo las columnas de las componentes: u y v del viento y la a?adimos a data Uviento=[] Vviento=[] for i in range(0,len(data['MagViento'])): Uviento.append(data['MagViento'][i]*sin(data[DirViento][i])) Vviento.append(data['MagViento'][i]*cos(data[DirViento][i])) data['u']=around(Uviento,1) data['v']=around(Vviento,1) data Data columns: Fecha 51 non-null values Hora 51 non-null values DirViento 51 non-null values MagViento 51 non-null values Temperatura 51 non-null values Humedad 51 non-null values PreciAcu 51 non-null values u 51 non-null values v 51 non-null values dtypes: float64(6), int64(2), object(2) Ahora indexamos los datos y agrupamos index=data.set_index(['Fecha','Hora'],inplace=True) grouped = index.groupby(level=0) por ejemplo data['u'] Fecha Hora 2011/07/01 00:00 -4.4 00:15 -1.7 00:30 -3.4 00:45 -7.4 01:00 -4.0 2011/07/02 00:00 -4.5 00:15 -4.2 00:30 -7.6 00:45 -3.8 01:00 -2.0 2011/07/03 00:00 -6.3 00:15 -13.7 00:30 -0.3 00:45 -2.5 01:00 -2.7 Ahora obtenemos la direccion media resultante para cada d?a grouped.apply(lambda x: ((scipy.arctan2(mean(x['uu']),mean(x['vv'])))/(pi/180.0))) Fecha 2011/07/01 -55.495677 2011/07/02 -39.176537 2011/07/03 -51.416339 al resultado anterior le debo aplicar las siguientes condiciones for i in grouped.apply(lambda x: ((scipy.arctan2(mean(x['uu']),mean(x['vv'])))/(pi/180.0))): if i < 180: i=i+180 else: if i > 180: i=i-180 else: i=i print i y obtenemos la siguiente salida 124.504323033 140.823463279 128.5836605 ?Por qu? no muestra la columna de fechas? c?mo se logra esto? C?mo incluir el resultado anterior a la columna DirRes y que ?sta se agregue a la siguiente salida stat_cea = grouped.agg({'DirRes':np.mean,'Temperatura':np.mean,'Humedad':np.mean,'PreciAcu':np.sum}) stat_cea Fecha DirRes Humedad PreciAcu Temperatura 2011/07/01 100.000000 30.4 21.367059 2011/07/02 99.823529 18.0 21.841765 2011/07/03 99.823529 4.0 21.347059 Agradecer? su valiosa ayuda ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kikocorreoso en gmail.com Mon Oct 21 22:06:17 2013 From: kikocorreoso en gmail.com (Kiko) Date: Mon, 21 Oct 2013 22:06:17 +0200 Subject: [Python-es] Realizar operaciones estadisticas en python In-Reply-To: <9e2ea4686d594a68a6756028f3944613@CO1PR07MB316.namprd07.prod.outlook.com> References: <9e2ea4686d594a68a6756028f3944613@CO1PR07MB316.namprd07.prod.outlook.com> Message-ID: > > > for i in grouped.apply(lambda x: ((scipy.arctan2(mean(x['uu']),mean(x['vv'])))/(pi/180.0))): > if i < 180: > i=i+180 > else: > if i > 180: > i=i-180 > else: > i=i > print i > > En lugar de aplicar un bucle puedes meterle un filtro a la columna de direcciones con las condiciones del bucle y volver a llenar la columna de direcciones con los nuevos valores y después le aplicas el np.mean a todas las columnas stat_cea = grouped.agg({'DirRes':np.mean,'Temperatura':np.mean,'Humedad':np.mean,'PreciAcu':np.sum}) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kelertxiki en gmail.com Mon Oct 21 22:15:20 2013 From: kelertxiki en gmail.com (Ander Garmendia) Date: Mon, 21 Oct 2013 22:15:20 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: <52655AD1.5040401@nabla.net> References: <52655AD1.5040401@nabla.net> Message-ID: Buenas, gracias a todos por el interes. Creo que me ha quedado bastante claro el asunto. - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la sintaxis que ha utilizado Juan. - Sergio, no estoy intentando resolver ningún problema, solamente estoy "jugando" con los decoradores y viendo de lo que son capaces. Y mi pregunta surge desde ese interes. - Y enlazando la frase anterior, gracias Txema por tu post, ya que bien explicas para que son bueno los decoradores y para que no. Ander. P.D.: Perdón por el fallo ortográfico en el asunto del correo, me he dado cuenta tarde de haber metido la pata. La costumbre... El día 21 de octubre de 2013 18:48, Txema Vicente escribió: > Buenas. > > Aunque puedas usar decoradores para ampliar la clase que decoran, yo no veo > los decoradores como sustitutos de la herencia, ni ninguna reduccion de > codigo. > > No necesitas decoradores para hacer eso, puedes asignar una funcion a un > atributo de la clase (B.F = F). Ademas, como te pongas a crear clases > decoradas que se amplian en ejecucion, a ver como lo explicas luego. > > Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que van > a manejar algo, como funciones que van a tratar los eventos de un GUI, o > responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras > hacer, sera con una funcion o con una clase, con argumentos o sin ellos. > > Tambien tienes el decorador @classmethod por si quieres crear clases que > puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar > como "factoria" de clases. > Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de > organizacion de API. > > La herencia es algo claro y maravilloso que te permite organizar las cosas. > El decorador es un "atajo del idioma" para trastear con las funciones, no > hay nada que realmente no puedas hacer sin usarlo. > > > El 21/10/2013 15:37, Ander Garmendia escribió: > > Buenas, > > estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo > una duda que quizá alguien me pueda aclarar. > > Digamos que tenemos una clase ( llamemosla B ) a la que queremos > añadir una funcionalidad (llamemosla F). El método clásico sería > heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla > C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo > normal y corriente. > > Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos > crear una clase decoradora ( llamemosla D ) que implemente la > funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B > ), añade la funcionalidad F en la clase B sin necesidad de herencias > de ningún tipo. > > Visto así, todo parece muy cómodo, se escribe menos código, hay menos > clases implicadas, etc. > Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica > extendida al escribir código en python ( es pythonico y aceptable ) ? > ¿ o es mas una prueba conceptual ? > > Gracias de antemano y un saludo. > > Ander. > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > From olemis en gmail.com Mon Oct 21 23:40:55 2013 From: olemis en gmail.com (Olemis Lang) Date: Mon, 21 Oct 2013 17:40:55 -0400 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: Message-ID: Hay varias estructuras formalizadas para hacer estas cosas. Yo prefiero: - Los traits (como en SCALA) - El patron d dise~no decorator del GoF Los decoradores d clases en Python son mas bien un artificio, una estructura sintactica. Sent from Android -- Regards Olemis - @olemislc Blog-ES : http://simelo-es.blogspot.com Blog-EN : http://simelo-en.blogspot.com Projects : http://blood-hound.net On Oct 21, 2013 9:37 AM, "Ander Garmendia" wrote: > Buenas, > > estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo > una duda que quizá alguien me pueda aclarar. > > Digamos que tenemos una clase ( llamemosla B ) a la que queremos > añadir una funcionalidad (llamemosla F). El método clásico sería > heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla > C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo > normal y corriente. > > Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos > crear una clase decoradora ( llamemosla D ) que implemente la > funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B > ), añade la funcionalidad F en la clase B sin necesidad de herencias > de ningún tipo. > > Visto así, todo parece muy cómodo, se escribe menos código, hay menos > clases implicadas, etc. > Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica > extendida al escribir código en python ( es pythonico y aceptable ) ? > ¿ o es mas una prueba conceptual ? > > Gracias de antemano y un saludo. > > Ander. > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From riello57 en gmail.com Tue Oct 22 10:06:17 2013 From: riello57 en gmail.com (Fernando Garcia) Date: Tue, 22 Oct 2013 10:06:17 +0200 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Está solucionado. A veces uno se complica la vida innecesariamente. Es parecido a lo que tu has dicho. Para empezar, volví la configuración de Python (2.7) a su codificación original. Luego, simplemente cambié: archivo=open("archivo.txt", "r") por: archivo=codecs.open("archivo.txt","r", encoding='iso-8859-1') que en realidad es una linea que tenía comentada (porque si la pones después de que has cambiado la configuración por defecto, no hace nada) Y simplemente con eso, tienes la misma eficacia, y el ejecutable corre también de maravilla. Gracias y un saludo. El 21 de octubre de 2013 17:58, Ricardo Cárdenes escribió: > En las líneas que te da el fallo: > > (*)linea=unicode(linea) > (*)nombre=unicode(nombre) > > estás pidiéndole a Python que convierta "linea" y "nombre", que son > cadenas normales (asumimos que esto es Python2.x, claro) en cadenas de > tipo Unicode. Hay un problema aquí y es que claro, Python no sabe qué > codificación tienen las cadenas originales y lo que hará es usar la > codificación por defecto (que es lo que has modificado en el paquete > "site"). > > Pero lo puedes especificar: > > CODIFICACION="iso-8859-1" > [...] > linea=unicode(linea, CODIFICACION) > nombre=unicode(nombre, CODIFICACION) > [...] > > haciendo eso debería de desaparecer el error. > > > > 2013/10/21 Fernando Garcia : > > Cierto, he cambiado la configuración por defecto de Python, incluyendo > en la > > carpeta site.packages un archivo donde se cambia la codificación por > defecto > > de asciia iso-8859-1. Es la única manera que conozco de que el programa > me > > admita incluir acentos en las búsquedas. Si conoces alguna otra forma, > por > > favor indícamelo y de esa forma podré restituir la configuración a su > estado > > inicial, sin merma de su eficacia. Gracias > > > > > > El 21 de octubre de 2013 10:53, Ricardo Cárdenes > > escribió: > > > >> El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino > >> de la configuración de Python. Si te dice que blahblah es un ordinal > >> que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en > >> tu Python normal, es bastante probable que hayas modificado el site.py > >> de tu máquina para que la codificación por defecto sea otra que no la > >> ASCII. Y también muy probable que al construir el .EXE, éste no se > >> lleve una copia de tu site.py (lógico, por otra parte), así que ese > >> cambio no queda reflejado. > >> > >> Si ése es el caso, hay dos maneras de corregirlo: la complicada pero > >> *recomendada*, que es poner tu site.py de vuelta como estaba y > >> corregir el programa para que funcione correctamente en cualquier > >> entorno. La sencilla pero *chapuza* es buscar la manera (no la > >> conozco) de que el site.py (o equivalente) que va en el .EXE vaya > >> modificado... o cambiarlo al vuelo al arrancar el programa, pero creo > >> que para ese momento ya es tarde. > >> > >> Saludos, > >> Ricardo > >> > >> 2013/10/20 Guillermo Vaya : > >> > Creo que sería más fácil ayudarte si pegas el trozo de código donde se > >> > genera el error (Con la cantidad suficiente como para poder ver donde > >> > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo > >> > error. > >> > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura > de > >> > código. > >> > > >> > Además, deberías pegar el error concreto, que no cuesta mucho y da más > >> > información. > >> > > >> > Un saludo > >> > > >> > > >> > 2013/10/20 Fernando Garcia > >> >> > >> >> Estoy escribiendo una aplicación para gestionar una base de datos con > >> >> el > >> >> personal de una empresa. > >> >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas > y > >> >> acentos (lo que se llama normalizar texto, vamos) debo convertir cada > >> >> linea > >> >> de string a unicode. Haciéndolo así, la aplicación funciona > >> >> correctamente, > >> >> ningún problema... siempre que se ejecute desde el código fuente. > Desde > >> >> el > >> >> intérprete de python, vamos. > >> >> Pero cuando convierto la aplicación a un ejecutable .exe para su > >> >> distribución, me da un error, localizado en la linea donde convierto > la > >> >> bd a > >> >> unicode: el típico ordinal not i range, etc, etc... > >> >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? > >> >> > >> >> > >> >> _______________________________________________ > >> >> Python-es mailing list > >> >> Python-es en python.org > >> >> https://mail.python.org/mailman/listinfo/python-es > >> >> FAQ: http://python-es-faq.wikidot.com/ > >> >> > >> > > >> > > >> > _______________________________________________ > >> > Python-es mailing list > >> > Python-es en python.org > >> > https://mail.python.org/mailman/listinfo/python-es > >> > FAQ: http://python-es-faq.wikidot.com/ > >> > > >> _______________________________________________ > >> Python-es mailing list > >> Python-es en python.org > >> https://mail.python.org/mailman/listinfo/python-es > >> FAQ: http://python-es-faq.wikidot.com/ > > > > > > > > _______________________________________________ > > Python-es mailing list > > Python-es en python.org > > https://mail.python.org/mailman/listinfo/python-es > > FAQ: http://python-es-faq.wikidot.com/ > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From hfoffani en gmail.com Tue Oct 22 10:14:33 2013 From: hfoffani en gmail.com (Hernan M. F.) Date: Tue, 22 Oct 2013 10:14:33 +0200 Subject: [Python-es] =?windows-1252?q?=BF_Injecci=F3n_de_c=F3digo_con_deco?= =?windows-1252?q?radores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: > gracias a todos por el interes. Creo que me ha quedado bastante claro el asunto. > > - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la > sintaxis que ha utilizado Juan. > - Sergio, no estoy intentando resolver ningún problema, solamente > estoy "jugando" con los decoradores y viendo de lo que son capaces. Y > mi pregunta surge desde ese interes. > - Y enlazando la frase anterior, gracias Txema por tu post, ya que > bien explicas para que son bueno los decoradores y para que no. Ten cuidado cuando cambies el comportamiento de objetos al vuelo. Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: class C (B): def __init__(self): self._f_provider = D() def F(self): self._f_provider.F() Tampoco estás obligado a definir una clase y usar métodos, esto no es Java. F() podría ser un procedimiento o función de un módulo. Con la herencia múltiple de Python (que a veces se nos olvida que tiene), sería: 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras otros ocho mil problemas nuevos? Y si el problema y el marco de la solución lo merece lo mas formal es usar abc. Keep it simple. ;-) > > El día 21 de octubre de 2013 18:48, Txema Vicente escribió: >> Buenas. >> >> Aunque puedas usar decoradores para ampliar la clase que decoran, yo no veo >> los decoradores como sustitutos de la herencia, ni ninguna reduccion de >> codigo. >> >> No necesitas decoradores para hacer eso, puedes asignar una funcion a un >> atributo de la clase (B.F = F). Ademas, como te pongas a crear clases >> decoradas que se amplian en ejecucion, a ver como lo explicas luego. >> >> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que van >> a manejar algo, como funciones que van a tratar los eventos de un GUI, o >> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras >> hacer, sera con una funcion o con una clase, con argumentos o sin ellos. >> >> Tambien tienes el decorador @classmethod por si quieres crear clases que >> puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar >> como "factoria" de clases. >> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de >> organizacion de API. >> >> La herencia es algo claro y maravilloso que te permite organizar las cosas. >> El decorador es un "atajo del idioma" para trastear con las funciones, no >> hay nada que realmente no puedas hacer sin usarlo. >> >> >> El 21/10/2013 15:37, Ander Garmendia escribió: >> >> Buenas, >> >> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >> una duda que quizá alguien me pueda aclarar. >> >> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >> añadir una funcionalidad (llamemosla F). El método clásico sería >> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >> normal y corriente. >> >> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >> crear una clase decoradora ( llamemosla D ) que implemente la >> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >> ), añade la funcionalidad F en la clase B sin necesidad de herencias >> de ningún tipo. >> >> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >> clases implicadas, etc. >> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >> extendida al escribir código en python ( es pythonico y aceptable ) ? >> ¿ o es mas una prueba conceptual ? >> >> Gracias de antemano y un saludo. >> >> Ander. >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From ricardo.cardenes en gmail.com Tue Oct 22 11:41:05 2013 From: ricardo.cardenes en gmail.com (=?ISO-8859-1?Q?Ricardo_C=E1rdenes?=) Date: Tue, 22 Oct 2013 10:41:05 +0100 Subject: [Python-es] Conflicto python-exe In-Reply-To: References: Message-ID: Ah, sí :D. Me salté ese comentario y fui directo a las líneas que daban problema O:-) 2013/10/22 Fernando Garcia : > Está solucionado. A veces uno se complica la vida innecesariamente. Es > parecido a lo que tu has dicho. > Para empezar, volví la configuración de Python (2.7) a su codificación > original. > Luego, simplemente cambié: > archivo=open("archivo.txt", "r") > por: > archivo=codecs.open("archivo.txt","r", encoding='iso-8859-1') > que en realidad es una linea que tenía comentada (porque si la pones después > de que has cambiado la configuración por defecto, no hace nada) > Y simplemente con eso, tienes la misma eficacia, y el ejecutable corre > también de maravilla. > Gracias y un saludo. > > > El 21 de octubre de 2013 17:58, Ricardo Cárdenes > escribió: > >> En las líneas que te da el fallo: >> >> (*)linea=unicode(linea) >> (*)nombre=unicode(nombre) >> >> estás pidiéndole a Python que convierta "linea" y "nombre", que son >> cadenas normales (asumimos que esto es Python2.x, claro) en cadenas de >> tipo Unicode. Hay un problema aquí y es que claro, Python no sabe qué >> codificación tienen las cadenas originales y lo que hará es usar la >> codificación por defecto (que es lo que has modificado en el paquete >> "site"). >> >> Pero lo puedes especificar: >> >> CODIFICACION="iso-8859-1" >> [...] >> linea=unicode(linea, CODIFICACION) >> nombre=unicode(nombre, CODIFICACION) >> [...] >> >> haciendo eso debería de desaparecer el error. >> >> >> >> 2013/10/21 Fernando Garcia : >> > Cierto, he cambiado la configuración por defecto de Python, incluyendo >> > en la >> > carpeta site.packages un archivo donde se cambia la codificación por >> > defecto >> > de asciia iso-8859-1. Es la única manera que conozco de que el programa >> > me >> > admita incluir acentos en las búsquedas. Si conoces alguna otra forma, >> > por >> > favor indícamelo y de esa forma podré restituir la configuración a su >> > estado >> > inicial, sin merma de su eficacia. Gracias >> > >> > >> > El 21 de octubre de 2013 10:53, Ricardo Cárdenes >> > escribió: >> > >> >> El mensaje concreto que indicas es clásico, no de los .EXE en sí, sino >> >> de la configuración de Python. Si te dice que blahblah es un ordinal >> >> que no está en ASCII al convertirlo en .EXE, pero no al ejecutarlo en >> >> tu Python normal, es bastante probable que hayas modificado el site.py >> >> de tu máquina para que la codificación por defecto sea otra que no la >> >> ASCII. Y también muy probable que al construir el .EXE, éste no se >> >> lleve una copia de tu site.py (lógico, por otra parte), así que ese >> >> cambio no queda reflejado. >> >> >> >> Si ése es el caso, hay dos maneras de corregirlo: la complicada pero >> >> *recomendada*, que es poner tu site.py de vuelta como estaba y >> >> corregir el programa para que funcione correctamente en cualquier >> >> entorno. La sencilla pero *chapuza* es buscar la manera (no la >> >> conozco) de que el site.py (o equivalente) que va en el .EXE vaya >> >> modificado... o cambiarlo al vuelo al arrancar el programa, pero creo >> >> que para ese momento ya es tarde. >> >> >> >> Saludos, >> >> Ricardo >> >> >> >> 2013/10/20 Guillermo Vaya : >> >> > Creo que sería más fácil ayudarte si pegas el trozo de código donde >> >> > se >> >> > genera el error (Con la cantidad suficiente como para poder ver donde >> >> > inicializas cosas y tal) o un ejemplo pequeño que reproduzca el mismo >> >> > error. >> >> > Te recomiendo usar algún tipo de pastebin, para facilitar la lectura >> >> > de >> >> > código. >> >> > >> >> > Además, deberías pegar el error concreto, que no cuesta mucho y da >> >> > más >> >> > información. >> >> > >> >> > Un saludo >> >> > >> >> > >> >> > 2013/10/20 Fernando Garcia >> >> >> >> >> >> Estoy escribiendo una aplicación para gestionar una base de datos >> >> >> con >> >> >> el >> >> >> personal de una empresa. >> >> >> Para conseguir que la búsqueda en la bd sea indiferente a mayúsculas >> >> >> y >> >> >> acentos (lo que se llama normalizar texto, vamos) debo convertir >> >> >> cada >> >> >> linea >> >> >> de string a unicode. Haciéndolo así, la aplicación funciona >> >> >> correctamente, >> >> >> ningún problema... siempre que se ejecute desde el código fuente. >> >> >> Desde >> >> >> el >> >> >> intérprete de python, vamos. >> >> >> Pero cuando convierto la aplicación a un ejecutable .exe para su >> >> >> distribución, me da un error, localizado en la linea donde convierto >> >> >> la >> >> >> bd a >> >> >> unicode: el típico ordinal not i range, etc, etc... >> >> >> ¿Alguien sabe porqué ocurre esto y como se puede solucionar? >> >> >> >> >> >> >> >> >> _______________________________________________ >> >> >> Python-es mailing list >> >> >> Python-es en python.org >> >> >> https://mail.python.org/mailman/listinfo/python-es >> >> >> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> >> > >> >> > >> >> > _______________________________________________ >> >> > Python-es mailing list >> >> > Python-es en python.org >> >> > https://mail.python.org/mailman/listinfo/python-es >> >> > FAQ: http://python-es-faq.wikidot.com/ >> >> > >> >> _______________________________________________ >> >> Python-es mailing list >> >> Python-es en python.org >> >> https://mail.python.org/mailman/listinfo/python-es >> >> FAQ: http://python-es-faq.wikidot.com/ >> > >> > >> > >> > _______________________________________________ >> > Python-es mailing list >> > Python-es en python.org >> > https://mail.python.org/mailman/listinfo/python-es >> > FAQ: http://python-es-faq.wikidot.com/ >> > >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > From yeiniel en uclv.cu Tue Oct 22 14:50:11 2013 From: yeiniel en uclv.cu (=?UTF-8?Q?Yeiniel_Su=C3=A1rez_Sosa?=) Date: Tue, 22 Oct 2013 08:50:11 -0400 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: Hola nuevamente Yo normalmente no escribo en esta lista, lo cual es malo para la comunidad y me disculpo, pero estoy haciéndolo ahora porque el tema es teórico y merece la pena (al menos desde mi punto de vista) lograr buenas prácticas en la comunidad. Ander Garmendia en el post original usted dice que quiere añadir una funcionalidad F a una clase B. Aquí es necesario dejar bien claro si el problema es que B necesita la funcionalidad F para hacer su trabajo o si B tiene que exponer la funcionalidad F. En el primer caso estamos tratando con un problema de dependencia, del cual expuse mi forma de tratarlo. Si el problema es que B necesita exponer a F, bueno el problema es otro, porque todo depende de que tipo de elemento es F. La herencia es para crear objetos que son una especialización de otro más general, que B herede de C solo es correcto si B es un caso especifico de C, de lo contrario la herencia no tiene sentido. En el caso de que B necesite exponer un método de C pero no es una especialización de esta clase, entonces el problema todavía es de dependencia (composición) y no de herencia. ahh, se me olvidaba, la sintaxis correcta para inyectar atributos a la clase es la de Juan, saludos para el Hernan M. F Particularmente encuentro el ejemplo que presentas como poco elegante. Porque en ese caso la clase C tiene una dependencia fija en el código al método F() de la clase D la cual no puede ser modificada (bueno, si puede ser modificada empleando settatr(), lo que hace a Python excelente desde mi punto de vista). La cuestión es que se programa una vez, pero se modifica el código y se revisa múltiples veces y en este caso el usuario de C tiene que leer todo el código para darse cuenta de que cambiar si necesita reemplazar D.F por otra cosa. Y finalmente si F es una función que no dependa de que argumentos reciba D en el constructor, entonces no es necesario que sea miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: class C: def __init__(self, f=None): if f is None: d = D() f = d.f settatr(self, 'f', f) def f(self): raise NotImplementedError() Esta variante le deja claro al usuario que solo con parametrizar la clase C puede reemplazar la maquinaria externa que consume la clase. Finalmente quiero decir (mi criterio nuevamente y el de algunas personas que asi lo ponen en sus blogs) que la herencia multiple no es la forma de inyectar comportamiento en una clase y que debe ser usada con mucho cuidado. Herencia es herencia, una persona hereda de animal pero un navegador web no hereda de conexión de red solo porque la use y la herencia lo pueda hacer parecer que funciona. Atentamente Ing. Yeiniel Suárez Sosa Profesor Instructor, Dep. Automática y Sistemas Computacionales Facultad de Ingeniería Eléctrica, Universidad Central "Marta Abreu" de las Villas (UCLV) On 2013-10-22 04:14, Hernan M. F. wrote: >> gracias a todos por el interes. Creo que me ha quedado bastante >> claro el asunto. >> >> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con >> la >> sintaxis que ha utilizado Juan. >> - Sergio, no estoy intentando resolver ningún problema, solamente >> estoy "jugando" con los decoradores y viendo de lo que son capaces. >> Y >> mi pregunta surge desde ese interes. >> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >> bien explicas para que son bueno los decoradores y para que no. > > Ten cuidado cuando cambies el comportamiento de objetos al vuelo. > > Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: > class C (B): > def __init__(self): > self._f_provider = D() > def F(self): > self._f_provider.F() > > Tampoco estás obligado a definir una clase y usar métodos, esto no es > Java. > F() podría ser un procedimiento o función de un módulo. > > Con la herencia múltiple de Python (que a veces se nos olvida que > tiene), sería: > 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras > otros ocho mil > problemas nuevos? > > Y si el problema y el marco de la solución lo merece lo mas formal es > usar abc. > > Keep it simple. ;-) > >> >> El día 21 de octubre de 2013 18:48, Txema Vicente >> escribió: >>> Buenas. >>> >>> Aunque puedas usar decoradores para ampliar la clase que decoran, >>> yo no veo >>> los decoradores como sustitutos de la herencia, ni ninguna >>> reduccion de >>> codigo. >>> >>> No necesitas decoradores para hacer eso, puedes asignar una funcion >>> a un >>> atributo de la clase (B.F = F). Ademas, como te pongas a crear >>> clases >>> decoradas que se amplian en ejecucion, a ver como lo explicas >>> luego. >>> >>> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones >>> que van >>> a manejar algo, como funciones que van a tratar los eventos de un >>> GUI, o >>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que >>> quieras >>> hacer, sera con una funcion o con una clase, con argumentos o sin >>> ellos. >>> >>> Tambien tienes el decorador @classmethod por si quieres crear >>> clases que >>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o >>> actuar >>> como "factoria" de clases. >>> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos >>> de >>> organizacion de API. >>> >>> La herencia es algo claro y maravilloso que te permite organizar >>> las cosas. >>> El decorador es un "atajo del idioma" para trastear con las >>> funciones, no >>> hay nada que realmente no puedas hacer sin usarlo. >>> >>> >>> El 21/10/2013 15:37, Ander Garmendia escribió: >>> >>> Buenas, >>> >>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y >>> tengo >>> una duda que quizá alguien me pueda aclarar. >>> >>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>> añadir una funcionalidad (llamemosla F). El método clásico sería >>> heredar desde la clase base ( B ) y crear una nueva clase ( >>> llamemosla >>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>> normal y corriente. >>> >>> Ahora llega python y nos ofrece los decoradores, por lo tanto, >>> podemos >>> crear una clase decoradora ( llamemosla D ) que implemente la >>> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase >>> B >>> ), añade la funcionalidad F en la clase B sin necesidad de >>> herencias >>> de ningún tipo. >>> >>> Visto así, todo parece muy cómodo, se escribe menos código, hay >>> menos >>> clases implicadas, etc. >>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta >>> practica >>> extendida al escribir código en python ( es pythonico y aceptable ) >>> ? >>> ¿ o es mas una prueba conceptual ? >>> >>> Gracias de antemano y un saludo. >>> >>> Ander. >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >>> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- From kelertxiki en gmail.com Wed Oct 23 11:54:28 2013 From: kelertxiki en gmail.com (Ander Garmendia) Date: Wed, 23 Oct 2013 11:54:28 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: Buenos dias, para empezar, Yeiniel, por favor, tuteame que si me siento mas viejo ;) Siguiendo con el tema, lo que tenía yo en mente, era el segundo caso que has citado en el mensaje anterior: esto es B quiere exponer una funcionalidad F. Al respecto, un ejemplo, sería poder añadir conectividad con BBDD sin tener que modificar la clase B. El decorador se encargaria de gestionar la conexión y ejecutar las querys. Quizá este no sea el mejor ejemplo ( yo no lo haría de esa manera ) pero creo que resume bien lo que planteé en el primer mensaje. Simplificando, el código sería el siguiente: class Decor(object): '''Decora la clase para anadir funcionalidades''' def __init__(self, arg): self.arg = arg print "Clase decoradora" print self.arg def __call__(self, cls): class Wrapper(cls): classattr = self.arg print "En wrapper de clase decoradora" def my_method(self, value): print "New my method {0}, conn string: {1}".format(value, self.classattr) def new_method(self, value): print "New new method {0}".format(value) return Wrapper @Decor('mysql') class B(object): def __init__(self, nombre): self.nombre = nombre print "Creo objeto B" def show_name(self): print "My nombre es {0}".format(self.izena) def __call__(self): print "Inside call" a = B('Ander') a.my_method('Ander') a.new_method('Ander2') El código es válido y anade las funciones a la clase decorada, pero no me acaba de gustar y es por eso por lo que formulé la pregunta. Un saludo. Ander. El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa escribió: > Hola nuevamente > Yo normalmente no escribo en esta lista, lo cual es malo para la comunidad y > me disculpo, pero estoy haciéndolo ahora porque el tema es teórico y merece > la pena (al menos desde mi punto de vista) lograr buenas prácticas en la > comunidad. > > Ander Garmendia > en el post original usted dice que quiere añadir una funcionalidad F a una > clase B. Aquí es necesario dejar bien claro si el problema es que B necesita > la funcionalidad F para hacer su trabajo o si B tiene que exponer la > funcionalidad F. En el primer caso estamos tratando con un problema de > dependencia, del cual expuse mi forma de tratarlo. Si el problema es que B > necesita exponer a F, bueno el problema es otro, porque todo depende de que > tipo de elemento es F. La herencia es para crear objetos que son una > especialización de otro más general, que B herede de C solo es correcto si B > es un caso especifico de C, de lo contrario la herencia no tiene sentido. En > el caso de que B necesite exponer un método de C pero no es una > especialización de esta clase, entonces el problema todavía es de > dependencia (composición) y no de herencia. > > ahh, se me olvidaba, la sintaxis correcta para inyectar atributos a la clase > es la de Juan, saludos para el > > Hernan M. F > Particularmente encuentro el ejemplo que presentas como poco elegante. > Porque en ese caso la clase C tiene una dependencia fija en el código al > método F() de la clase D la cual no puede ser modificada (bueno, si puede > ser modificada empleando settatr(), lo que hace a Python excelente desde mi > punto de vista). La cuestión es que se programa una vez, pero se modifica el > código y se revisa múltiples veces y en este caso el usuario de C tiene que > leer todo el código para darse cuenta de que cambiar si necesita reemplazar > D.F por otra cosa. Y finalmente si F es una función que no dependa de que > argumentos reciba D en el constructor, entonces no es necesario que sea > miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: > > class C: > def __init__(self, f=None): > if f is None: > d = D() > f = d.f > > settatr(self, 'f', f) > > def f(self): > raise NotImplementedError() > > Esta variante le deja claro al usuario que solo con parametrizar la clase C > puede reemplazar la maquinaria externa que consume la clase. Finalmente > quiero decir (mi criterio nuevamente y el de algunas personas que asi lo > ponen en sus blogs) que la herencia multiple no es la forma de inyectar > comportamiento en una clase y que debe ser usada con mucho cuidado. Herencia > es herencia, una persona hereda de animal pero un navegador web no hereda de > conexión de red solo porque la use y la herencia lo pueda hacer parecer que > funciona. > > Atentamente > Ing. Yeiniel Suárez Sosa > Profesor Instructor, Dep. Automática y Sistemas Computacionales > Facultad de Ingeniería Eléctrica, Universidad Central "Marta Abreu" de las > Villas (UCLV) > > > On 2013-10-22 04:14, Hernan M. F. wrote: >>> >>> gracias a todos por el interes. Creo que me ha quedado bastante claro el >>> asunto. >>> >>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la >>> sintaxis que ha utilizado Juan. >>> - Sergio, no estoy intentando resolver ningún problema, solamente >>> estoy "jugando" con los decoradores y viendo de lo que son capaces. Y >>> mi pregunta surge desde ese interes. >>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>> bien explicas para que son bueno los decoradores y para que no. >> >> >> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >> >> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >> class C (B): >> def __init__(self): >> self._f_provider = D() >> def F(self): >> self._f_provider.F() >> >> Tampoco estás obligado a definir una clase y usar métodos, esto no es >> Java. >> F() podría ser un procedimiento o función de un módulo. >> >> Con la herencia múltiple de Python (que a veces se nos olvida que tiene), >> sería: >> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >> otros ocho mil >> problemas nuevos? >> >> Y si el problema y el marco de la solución lo merece lo mas formal es usar >> abc. >> >> Keep it simple. ;-) >> >>> >>> El día 21 de octubre de 2013 18:48, Txema Vicente >>> escribió: >>>> >>>> Buenas. >>>> >>>> Aunque puedas usar decoradores para ampliar la clase que decoran, yo no >>>> veo >>>> los decoradores como sustitutos de la herencia, ni ninguna reduccion de >>>> codigo. >>>> >>>> No necesitas decoradores para hacer eso, puedes asignar una funcion a un >>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear clases >>>> decoradas que se amplian en ejecucion, a ver como lo explicas luego. >>>> >>>> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que >>>> van >>>> a manejar algo, como funciones que van a tratar los eventos de un GUI, o >>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras >>>> hacer, sera con una funcion o con una clase, con argumentos o sin ellos. >>>> >>>> Tambien tienes el decorador @classmethod por si quieres crear clases que >>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar >>>> como "factoria" de clases. >>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de >>>> organizacion de API. >>>> >>>> La herencia es algo claro y maravilloso que te permite organizar las >>>> cosas. >>>> El decorador es un "atajo del idioma" para trastear con las funciones, >>>> no >>>> hay nada que realmente no puedas hacer sin usarlo. >>>> >>>> >>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>> >>>> Buenas, >>>> >>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >>>> una duda que quizá alguien me pueda aclarar. >>>> >>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>> normal y corriente. >>>> >>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >>>> ), añade la funcionalidad F en la clase B sin necesidad de herencias >>>> de ningún tipo. >>>> >>>> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >>>> clases implicadas, etc. >>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >>>> extendida al escribir código en python ( es pythonico y aceptable ) ? >>>> ¿ o es mas una prueba conceptual ? >>>> >>>> Gracias de antemano y un saludo. >>>> >>>> Ander. >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > -- > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From pych3m4 en gmail.com Wed Oct 23 11:56:45 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 23 Oct 2013 11:56:45 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa escribió: > Hernan M. F > Particularmente encuentro el ejemplo que presentas como poco elegante. > Porque en ese caso la clase C tiene una dependencia fija en el código al > método F() de la clase D la cual no puede ser modificada (bueno, si puede > ser modificada empleando settatr(), lo que hace a Python excelente desde mi > punto de vista). La cuestión es que se programa una vez, pero se modifica el > código y se revisa múltiples veces y en este caso el usuario de C tiene que > leer todo el código para darse cuenta de que cambiar si necesita reemplazar > D.F por otra cosa. Y finalmente si F es una función que no dependa de que > argumentos reciba D en el constructor, entonces no es necesario que sea > miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: > > class C: > def __init__(self, f=None): > if f is None: > d = D() > f = d.f > > settatr(self, 'f', f) > > def f(self): > raise NotImplementedError() > > Esta variante le deja claro al usuario que solo con parametrizar la clase C > puede reemplazar la maquinaria externa que consume la clase. Para hacer estas cosas estarían las "clases abstractas". Aunque en python no es habitual, existe ciertos esfuerzos para introducir clases abstractas canalizados a través del módulo 'abc' (Abstract Base Classes). Un modo "recomendable" para hacer este tipo de clases sería: import abc class C: __metaclass__=abc.ABCMeta def run(self): self.f() @abc.abstractmethod def f(self): pass Un ejemplo de su uso: class D(C): def f(self): other_f() #parcheo Si el "consumidor" de la clase olvidase sobrecargar alguno de los métodos abstractos de la clase, se produciría un error en tiempo de ejecución. >Finalmente > quiero decir (mi criterio nuevamente y el de algunas personas que asi lo > ponen en sus blogs) que la herencia multiple no es la forma de inyectar > comportamiento en una clase y que debe ser usada con mucho cuidado. Herencia > es herencia, una persona hereda de animal pero un navegador web no hereda de > conexión de red solo porque la use y la herencia lo pueda hacer parecer que > funciona. A la hora de extender una librería, habría que distinguir entre "especialización" (herencia) e "inyección" (parcheo). Normalmente, la especialización se hace hace añadiendo una nueva clase al final de la jerarquía, mientras que la inyección se puede hacer sobre cualquier nodo de la jerarquía. Desde el punto de vista del mantenimiento, cada cambio de la API va a suponer que el consumidor de la librería tenga que adaptar su código a los cambios de API. Estos cambios son más fáciles, casi triviales, en el caso de la inyección, pero bastante más difíciles con la herencia si requiere mantener varias ramas paralelas en la jerarquía de clases. Desde el punto de vista del creador de la librería, los decoradores de clase son una buena solución para agrupar en un mismo sitio todos los cambios derivados de un cambio de API. Conceptualmente, en lugar de modificar la jerarquía de clases con cada cambio, se pondría a disposición del cliente decoradores para adaptar sus clases a los cambios de cada API. Tal vez, la solución no sea ni especializar ni inyectar, si no una mezcla de ambas. > > On 2013-10-22 04:14, Hernan M. F. wrote: >>> >>> gracias a todos por el interes. Creo que me ha quedado bastante claro el >>> asunto. >>> >>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la >>> sintaxis que ha utilizado Juan. >>> - Sergio, no estoy intentando resolver ningún problema, solamente >>> estoy "jugando" con los decoradores y viendo de lo que son capaces. Y >>> mi pregunta surge desde ese interes. >>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>> bien explicas para que son bueno los decoradores y para que no. >> >> >> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >> >> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >> class C (B): >> def __init__(self): >> self._f_provider = D() >> def F(self): >> self._f_provider.F() >> >> Tampoco estás obligado a definir una clase y usar métodos, esto no es >> Java. >> F() podría ser un procedimiento o función de un módulo. >> >> Con la herencia múltiple de Python (que a veces se nos olvida que tiene), >> sería: >> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >> otros ocho mil >> problemas nuevos? >> >> Y si el problema y el marco de la solución lo merece lo mas formal es usar >> abc. >> >> Keep it simple. ;-) >> >>> >>> El día 21 de octubre de 2013 18:48, Txema Vicente >>> escribió: >>>> >>>> Buenas. >>>> >>>> Aunque puedas usar decoradores para ampliar la clase que decoran, yo no >>>> veo >>>> los decoradores como sustitutos de la herencia, ni ninguna reduccion de >>>> codigo. >>>> >>>> No necesitas decoradores para hacer eso, puedes asignar una funcion a un >>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear clases >>>> decoradas que se amplian en ejecucion, a ver como lo explicas luego. >>>> >>>> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones que >>>> van >>>> a manejar algo, como funciones que van a tratar los eventos de un GUI, o >>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que quieras >>>> hacer, sera con una funcion o con una clase, con argumentos o sin ellos. >>>> >>>> Tambien tienes el decorador @classmethod por si quieres crear clases que >>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o actuar >>>> como "factoria" de clases. >>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de >>>> organizacion de API. >>>> >>>> La herencia es algo claro y maravilloso que te permite organizar las >>>> cosas. >>>> El decorador es un "atajo del idioma" para trastear con las funciones, >>>> no >>>> hay nada que realmente no puedas hacer sin usarlo. >>>> >>>> >>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>> >>>> Buenas, >>>> >>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >>>> una duda que quizá alguien me pueda aclarar. >>>> >>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>> normal y corriente. >>>> >>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >>>> ), añade la funcionalidad F en la clase B sin necesidad de herencias >>>> de ningún tipo. >>>> >>>> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >>>> clases implicadas, etc. >>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >>>> extendida al escribir código en python ( es pythonico y aceptable ) ? >>>> ¿ o es mas una prueba conceptual ? >>>> >>>> Gracias de antemano y un saludo. >>>> >>>> Ander. >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > -- > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From yeiniel en uclv.cu Wed Oct 23 14:49:43 2013 From: yeiniel en uclv.cu (=?UTF-8?Q?Yeiniel_Su=C3=A1rez_Sosa?=) Date: Wed, 23 Oct 2013 08:49:43 -0400 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: Ander solo quiero decir que es muy mala idea que un decorador devuelva un objeto que no es el que decora, como en el ejemplo que presentas. Si realizas introspección no vas a ser capaz de saber quien es quien, porque el nombre de la clase de los objetos decorados queda oculta dentro de la implementación del decorador. Es preferible inyecta my_method y new_method empleando settatr. def decor(arg): def _decor(cls): def my_method(self, value): print "New my method {0}, conn string: {1}".format(value, arg) def new_method(self, value): print "New new method {0}".format(value) setattr(cls, 'my_method', my_method) setattr(cls, 'new_method', new_method) return cls return _decor Si deseas sacar los métodos my_method() hacia el modulo para que aparezcan en la documentación con help o sphynx entonces los puedes encapsular en una clase que reciba en la inicialización como argumento arg y en el decorador creas una instancia de la clase y empleando settatr transfieres los métodos de la instancia a la clase decorada. Pero bueno, me gustaría ver un ejemplo real de código donde piensas que esto se puede usar. Como estabas hablando de bases de datos te envío algo que uso. Yo tengo mucho código que emplea la DBAPI 2.0. Así que empleo el siguiente proveedor de conexión empleando sqlalchemy ========================== modulo engine_provider ============================= import sqlalchemy __all__ = ['EngineProvider'] class EngineProvider: """ `SQLAlchemy`_ support provider. This component provide support for use the ``SQLAlchemy`` library to connect to one database. The `get_engine` method is the only exposed service. The source database is configured using the `dsn` component attribute. If you need different database connections in the same application you can create multiple instances of this component and distribute them as needed. .. _SQLAlchemy: http://www.sqlalchemy.org/ """ dsn = 'sqlite:///application.db' def __init__(self, dsn=None): self._engine = sqlalchemy.create_engine(dsn or self.dsn) def get_engine(self) -> sqlalchemy.engine.Engine: """ Return an :class:`sqlalchemy.engine.Engine` object. :return: a ready to use :class:`sqlalchemy.engine.Engine` object. """ return self._engine ============================== fin del modulo engine_provider =========================== un ejemplo de codigo donde empleo esto es el siguiente ============================== modulo blog ======================================= # Copyright (c) 2011, Yeiniel Suarez Sosa. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of Yeiniel Suarez Sosa. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import datetime import os import sqlalchemy from sqlalchemy import engine, orm from aurora.webapp import foundation, infrastructure, mapping from aurora.webcomponents import layout, views from components import engine_provider from . import models __all__ = ['Blog'] class Blog: """ Blogging service provider. This component provide the three common services all blogging platforms provide (listing posts, showing posts and composing posts). It has three dependencies: - A :meth:`engine_provider.EngineProvider.get_engine` compliant service used to access and persist information into a relational database. - A :meth:`aurora.webcomponents.views.Views.render2response` compliant service used to implement the ``View`` part of the ``MVC`` design pattern. - A :meth:`aurora.webapp.infrastructure.Application.url_for` compliant service used to create suitable URLs for known Web request handlers. This component can be simply installed into your Web application by calling the two services (:meth:`setup_mapping` and :meth:`setup_views`) used to setup the component. The Web requests handler provided by this component produce partial content and therefore you need to use the :class:`aurora.webcomponents.layout.Layout` component to produce the final HTML output. """ def __init__(self, get_engine: engine_provider.EngineProvider.get_engine, render2response: views.Views.render2response, url_for: infrastructure.Application.url_for): self.get_engine = get_engine self.render2response = render2response self.url_for = url_for # create the model tables if they don't exist models.Model.metadata.create_all(self.get_engine()) # # stubs for services required by the component # def get_engine(self) -> engine.Engine: """ Return a :class:`sqlalchemy.engine.Engine` object. :return: A ready to use :class:`sqlalchemy.engine.Engine` object. """ raise NotImplementedError() def render2response(self, request: foundation.Request, template_name: str, **context) -> foundation.Response: """ Render a template into a :class:`~aurora.webapp.foundation.Response` object with context. Template file names must have two extensions. The first extension is used to identify the content type of the output and the second extension is used to identify the engine capable of handling correctly the syntax used in the template. :param request: The request object used to build the response. :param template_name: The relative template name string without the last extension. :param context: The context mapping. :return: The rendered :class:`~aurora.webapp.foundation.Response` object. """ raise NotImplementedError() def url_for(self, **characteristics) -> str: """ Create a fully usable url. :param characteristics: The Web request path characteristics. :return: A fully usable url. """ raise NotImplementedError() def get_profile_id(self, request: foundation.Request) -> str: """ Return the profile ID for the user related to the Web request. :param request: A Web request object. :return: The profile ID string. """ return 'admin' # # services provided by the component # def setup_mapping(self, add_rule: mapping.Mapper.add_rule, base_path='/'): add_rule(mapping.Route(base_path), _handler=self.list_posts) add_rule(mapping.Route(''.join((base_path, '(?P\d+)'))), _handler=self.show_post) add_rule(mapping.Route(''.join((base_path, 'compose'))), _handler=self.compose_post) def setup_views(self, add_path: views.Views.add_path): add_path(os.path.join(os.path.dirname(__file__), 'templates')) @layout.partial def list_posts(self, request: foundation.Request) -> foundation.Response: """ List summaries for posts added more recently. """ orm_session = orm.sessionmaker(bind=self.get_engine())() return self.render2response(request, 'blog/list.html', posts=orm_session.query(models.Post).filter( models.Post.published != None).order_by( sqlalchemy.desc(models.Post.published))[:10], blog=self, url_for=self.url_for) @layout.partial def show_post(self, request: foundation.Request) -> foundation.Response: """ Present a Blog post on the client browser. The value of the element from the `params` request mapping with keyword `id` is used as table row id if present. :param request: The :class:`Web request ` object. :return: A :class:`Web response ` object. """ id = request.params['id'] orm_session = orm.sessionmaker(bind=self.get_engine())() post = orm_session.query(models.Post).filter_by(id=id).one() return self.render2response(request, 'blog/show.html', post=post, blog=self, url_for=self.url_for) @layout.partial def compose_post(self, request: foundation.Request) -> foundation.Response: """ Present a form on the client browser used to compose a new Post. If the request method is ``POST`` this Web request handler attempt to process and persist the Blog post. :param request: The :class:`Web request ` object. :return: A :class:`Web response ` object. """ if request.method == 'POST': # process form submission # TODO: need to implement form validation here. post = models.Post( title=request.POST['title'], content=request.POST['content'], author=self.get_profile_id(request), created = datetime.datetime.utcnow(), modified = datetime.datetime.utcnow(), published=datetime.datetime.utcnow(), ) orm_session = orm.sessionmaker(bind=self.get_engine())() orm_session.add(post) orm_session.commit() # redirect to the post page resp = request.response_factory() resp.status_int = 302 resp.location = self.url_for(_handler=self.show_post, id=str(post.id)) return resp else: return self.render2response(request, 'blog/form.html', blog=self, url_for=self.url_for) ============================ fin del modulo blog =============================== fijate que el modulo engine_provider solo se usa en el modulo blog como documentacion en las anotaciones del constructor. luego para realizar la inyeccion de el proveedor de conexion en el componente blog empleo el siguiente modulo ============================ inicio del modulo di ================================ # Copyright (c) 2011, Yeiniel Suarez Sosa. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of Yeiniel Suarez Sosa. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ DI tools """ import collections __all__ = ['Dependency', 'list', 'dict', 'Reference', 'Value', 'inject', 'create_descriptor'] class Dependency: """ Dependency definition A dependency definition is used to construct the DI specification providing an indirection level. You don't need to inherit from this class to create a new definition type. The DI framework use duck typing thus as long as you provide a callable attribute named `resolve` that accept a single positional argument, everything is OK. """ def resolve(self, container: object) -> object: """ Resolve the target dependency This method is called by the DI framework in order to remove the indirection level at target construction. The only positional argument it receives is the DI container used as source. """ raise NotImplementedError() class list(Dependency, list): """ Definition that once it's resolved produce a list of dependencies It takes as constructor argument a list of dependency definition objects. """ def resolve(self, container): for i, value in enumerate(self): value = _normalize_dependency(value) self[i] = value.resolve(container) return self class dict(Dependency, dict): def resolve(self, container: object): for key, value in self.items(): value = _normalize_dependency(value) self[key] = value.resolve(container) return self class Reference(Dependency): """ Definition resolved as a named reference relative to the DI container. This is the most common definition type and every string found in the specification it is assumed to be a referenced and converted to an object of this type before the target object is built. """ def __init__(self, reference: str): self.reference = reference def resolve(self, container): target = container for part in self.reference.split('.'): target = getattr(target, part) return target class Value(Dependency): """ Definition resolved to a fixed value passed as constructor argument. This is a simple way used to pass configuration and fixed value objects. """ def __init__(self, value): self.value = value def resolve(self, container): return self.value def _normalize_dependency(dependency: Dependency) -> Dependency: if hasattr(dependency, 'resolve'): return dependency if isinstance(dependency, str): return Reference(dependency) return Value(dependency) def inject(target_factory: collections.Callable, container: object, *arg_spec, **attr_spec): """ Produce target by injecting its dependencies. The first positional argument is the factory for constructing the target object. The second positional argument is the container used as source of dependencies and any other positional arguments are definitions for factory arguments. Named arguments are used as attribute definitions for the target object. :param target_factory: The target factory callable. :return: The ready to use target object. """ # TODO: need to implement DI auto-resolution capabilities arg_spec = map(_normalize_dependency, arg_spec) attr_spec.update(map( lambda key, value: (key, _normalize_dependency(value)), attr_spec.items() )) args = list(map(lambda item: item.resolve(container), arg_spec)) target = target_factory(*args) for key in list(attr_spec): setattr(target, key, attr_spec[key].resolve(container)) return target def create_descriptor(target_factory: collections.Callable, *arg_spec, **attr_spec): """ Create a descriptor that produce target by injecting its dependencies. This function produce a descriptor object that create a target object the first time the attribute is accessed for every class instance. It use the class instance as DI container. """ class Descriptor: def __init__(self): self.cache = {} def __get__(self, instance, owner): if instance is None: return self try: return self.cache[instance] except KeyError: self.cache[instance] = inject(target_factory, instance, *arg_spec, **attr_spec) return self.cache[instance] return Descriptor() ====================================== fin del modulo di ===================================== donde lo unico importante realmente son las dos ultimas funciones y finalmente un ejemplo de como emplearlo todo ====================================== inicio del modulo application ========================= # Copyright (c) 2011, Yeiniel Suarez Sosa. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of Yeiniel Suarez Sosa. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import os from aurora import di, event, webapp from aurora.webcomponents import assets, layout, views from components import blog, engine_provider __all__ = ['Application'] class Application(webapp.Application): """ Blogpress blogging application. """ def __init__(self): super().__init__() self.mapper.add_rule(self.assets.rule_factory()) self.blog.setup_mapping(self.mapper.add_rule) self.blog.setup_views(self.views.add_path) self.views.add_path(os.path.join(os.path.dirname(__file__), 'templates')) self.views.add_default('url_for', self.url_for) self.views.add_default('assets', self.assets.handler) self.views.add_default('self', self) self.assets.add_path(os.path.join(os.path.dirname(__file__), 'static')) assets = di.create_descriptor(assets.Assets) blog = di.create_descriptor(blog.Blog, 'db.get_engine', 'views.render2response', 'url_for') db = di.create_descriptor(engine_provider.EngineProvider) layout = di.create_descriptor(layout.Layout, 'views.render') post_dispatch = di.create_descriptor(event.Event, di.list(['layout.post_dispatch'])) views = di.create_descriptor(views.Views) if __name__ == '__main__': from wsgiref import simple_server from aurora.webapp import foundation wsgi_app = foundation.wsgi(Application()) httpd = simple_server.make_server('', 8008, wsgi_app) print("Serving on port 8008...") httpd.serve_forever() ================================ fin del modulo application ======================== la parte de la clase Application donde se establecen estaticamente los atributos empleando di se pudiera reemplazar por codigo en el constructor, solo que asi es mas elegante y las cosas estan a la vista. Lo que esta ocurriendo es simplemente que la primera vez que se trata de acceder a la propiedad blog de una instancia de la clase Applicacion, el decorador de di crea una instancia de la clase Blog y la cachea para este objeto de la clase application. se emplea el metodo get_engine del atributo db del objeto de la clase application como primer argumento del constructor del componente blog (que es el metodo que provee conexion a DB), donde el attributo db tambien se crea empleando DI. Lo interesante es que puedes modificar la base de datos adicionando un argumento a la llamada db = di.create_descriptor(engine_provider.EngineProvider), en el siguiente ejemplo empleamos una base de datos supuestamente para desarrollo db = di.create_descriptor(engine_provider.EngineProvider, 'sqlite:///application.dev.db') bueno, asi es como hago las cosas, fijate que no uso herencia, porque el blog usa la conexion pero no es una conexion. DI es solo maquinaria para hacer el codigo as elegante donde usas los componentes, pero no para crear los componentes. atentamente Yeiniel On 2013-10-23 05:54, Ander Garmendia wrote: > Buenos dias, > > para empezar, Yeiniel, por favor, tuteame que si me siento mas viejo > ;) > > Siguiendo con el tema, lo que tenía yo en mente, era el segundo caso > que has citado en el mensaje anterior: esto es B quiere exponer una > funcionalidad F. > > Al respecto, un ejemplo, sería poder añadir conectividad con BBDD > sin > tener que modificar la clase B. El decorador se encargaria de > gestionar la conexión y ejecutar las querys. > > Quizá este no sea el mejor ejemplo ( yo no lo haría de esa manera ) > pero creo que resume bien lo que planteé en el primer mensaje. > Simplificando, el código sería el siguiente: > > class Decor(object): > '''Decora la clase para anadir funcionalidades''' > def __init__(self, arg): > self.arg = arg > print "Clase decoradora" > print self.arg > > def __call__(self, cls): > class Wrapper(cls): > classattr = self.arg > print "En wrapper de clase decoradora" > > def my_method(self, value): > print "New my method {0}, conn string: > {1}".format(value, self.classattr) > > def new_method(self, value): > print "New new method {0}".format(value) > > return Wrapper > > > @Decor('mysql') > class B(object): > def __init__(self, nombre): > self.nombre = nombre > print "Creo objeto B" > > def show_name(self): > print "My nombre es {0}".format(self.izena) > > def __call__(self): > print "Inside call" > > > a = B('Ander') > a.my_method('Ander') > a.new_method('Ander2') > > El código es válido y anade las funciones a la clase decorada, pero > no > me acaba de gustar y es por eso por lo que formulé la pregunta. > > Un saludo. > > Ander. > > El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa > escribió: >> Hola nuevamente >> Yo normalmente no escribo en esta lista, lo cual es malo para la >> comunidad y >> me disculpo, pero estoy haciéndolo ahora porque el tema es teórico y >> merece >> la pena (al menos desde mi punto de vista) lograr buenas prácticas >> en la >> comunidad. >> >> Ander Garmendia >> en el post original usted dice que quiere añadir una funcionalidad F >> a una >> clase B. Aquí es necesario dejar bien claro si el problema es que B >> necesita >> la funcionalidad F para hacer su trabajo o si B tiene que exponer la >> funcionalidad F. En el primer caso estamos tratando con un problema >> de >> dependencia, del cual expuse mi forma de tratarlo. Si el problema es >> que B >> necesita exponer a F, bueno el problema es otro, porque todo depende >> de que >> tipo de elemento es F. La herencia es para crear objetos que son una >> especialización de otro más general, que B herede de C solo es >> correcto si B >> es un caso especifico de C, de lo contrario la herencia no tiene >> sentido. En >> el caso de que B necesite exponer un método de C pero no es una >> especialización de esta clase, entonces el problema todavía es de >> dependencia (composición) y no de herencia. >> >> ahh, se me olvidaba, la sintaxis correcta para inyectar atributos a >> la clase >> es la de Juan, saludos para el >> >> Hernan M. F >> Particularmente encuentro el ejemplo que presentas como poco >> elegante. >> Porque en ese caso la clase C tiene una dependencia fija en el >> código al >> método F() de la clase D la cual no puede ser modificada (bueno, si >> puede >> ser modificada empleando settatr(), lo que hace a Python excelente >> desde mi >> punto de vista). La cuestión es que se programa una vez, pero se >> modifica el >> código y se revisa múltiples veces y en este caso el usuario de C >> tiene que >> leer todo el código para darse cuenta de que cambiar si necesita >> reemplazar >> D.F por otra cosa. Y finalmente si F es una función que no dependa >> de que >> argumentos reciba D en el constructor, entonces no es necesario que >> sea >> miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: >> >> class C: >> def __init__(self, f=None): >> if f is None: >> d = D() >> f = d.f >> >> settatr(self, 'f', f) >> >> def f(self): >> raise NotImplementedError() >> >> Esta variante le deja claro al usuario que solo con parametrizar la >> clase C >> puede reemplazar la maquinaria externa que consume la clase. >> Finalmente >> quiero decir (mi criterio nuevamente y el de algunas personas que >> asi lo >> ponen en sus blogs) que la herencia multiple no es la forma de >> inyectar >> comportamiento en una clase y que debe ser usada con mucho cuidado. >> Herencia >> es herencia, una persona hereda de animal pero un navegador web no >> hereda de >> conexión de red solo porque la use y la herencia lo pueda hacer >> parecer que >> funciona. >> >> Atentamente >> Ing. Yeiniel Suárez Sosa >> Profesor Instructor, Dep. Automática y Sistemas Computacionales >> Facultad de Ingeniería Eléctrica, Universidad Central "Marta Abreu" >> de las >> Villas (UCLV) >> >> >> On 2013-10-22 04:14, Hernan M. F. wrote: >>>> >>>> gracias a todos por el interes. Creo que me ha quedado bastante >>>> claro el >>>> asunto. >>>> >>>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con >>>> la >>>> sintaxis que ha utilizado Juan. >>>> - Sergio, no estoy intentando resolver ningún problema, solamente >>>> estoy "jugando" con los decoradores y viendo de lo que son >>>> capaces. Y >>>> mi pregunta surge desde ese interes. >>>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>>> bien explicas para que son bueno los decoradores y para que no. >>> >>> >>> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >>> >>> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >>> class C (B): >>> def __init__(self): >>> self._f_provider = D() >>> def F(self): >>> self._f_provider.F() >>> >>> Tampoco estás obligado a definir una clase y usar métodos, esto no >>> es >>> Java. >>> F() podría ser un procedimiento o función de un módulo. >>> >>> Con la herencia múltiple de Python (que a veces se nos olvida que >>> tiene), >>> sería: >>> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >>> otros ocho mil >>> problemas nuevos? >>> >>> Y si el problema y el marco de la solución lo merece lo mas formal >>> es usar >>> abc. >>> >>> Keep it simple. ;-) >>> >>>> >>>> El día 21 de octubre de 2013 18:48, Txema Vicente >>>> >>>> escribió: >>>>> >>>>> Buenas. >>>>> >>>>> Aunque puedas usar decoradores para ampliar la clase que decoran, >>>>> yo no >>>>> veo >>>>> los decoradores como sustitutos de la herencia, ni ninguna >>>>> reduccion de >>>>> codigo. >>>>> >>>>> No necesitas decoradores para hacer eso, puedes asignar una >>>>> funcion a un >>>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear >>>>> clases >>>>> decoradas que se amplian en ejecucion, a ver como lo explicas >>>>> luego. >>>>> >>>>> Los decoradores vienen bien, por ejemplo, para "enchufar" >>>>> funciones que >>>>> van >>>>> a manejar algo, como funciones que van a tratar los eventos de un >>>>> GUI, o >>>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que >>>>> quieras >>>>> hacer, sera con una funcion o con una clase, con argumentos o sin >>>>> ellos. >>>>> >>>>> Tambien tienes el decorador @classmethod por si quieres crear >>>>> clases que >>>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o >>>>> actuar >>>>> como "factoria" de clases. >>>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por >>>>> motivos de >>>>> organizacion de API. >>>>> >>>>> La herencia es algo claro y maravilloso que te permite organizar >>>>> las >>>>> cosas. >>>>> El decorador es un "atajo del idioma" para trastear con las >>>>> funciones, >>>>> no >>>>> hay nada que realmente no puedas hacer sin usarlo. >>>>> >>>>> >>>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>>> >>>>> Buenas, >>>>> >>>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y >>>>> tengo >>>>> una duda que quizá alguien me pueda aclarar. >>>>> >>>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>>> heredar desde la clase base ( B ) y crear una nueva clase ( >>>>> llamemosla >>>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>>> normal y corriente. >>>>> >>>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, >>>>> podemos >>>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la >>>>> clase B >>>>> ), añade la funcionalidad F en la clase B sin necesidad de >>>>> herencias >>>>> de ningún tipo. >>>>> >>>>> Visto así, todo parece muy cómodo, se escribe menos código, hay >>>>> menos >>>>> clases implicadas, etc. >>>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta >>>>> practica >>>>> extendida al escribir código en python ( es pythonico y aceptable >>>>> ) ? >>>>> ¿ o es mas una prueba conceptual ? >>>>> >>>>> Gracias de antemano y un saludo. >>>>> >>>>> Ander. >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> -- >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Ing. Yeiniel Suárez Sosa Profesor Instructor, Dep. Automática FIE, UCLV From yeiniel en uclv.cu Wed Oct 23 14:53:07 2013 From: yeiniel en uclv.cu (=?UTF-8?Q?Yeiniel_Su=C3=A1rez_Sosa?=) Date: Wed, 23 Oct 2013 08:53:07 -0400 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: Hernan, hola solo quiero llamarte la atención que en el ejemplo que pones, solo es posible modificar tu clase C por herencia y no por inyección. Por eso es que yo no declaro mis componentes abstractos, solo que para crearlos necesitas pasarles sus dependencias en el constructor o si son opcionales reescribo los atributos en el objeto. Por eso para las dependencias estrictas (las cosas sin las cuales el objeto no puede funcionar) pondo un estub que simplemente dice que no esta implementado para forzar al desarrollador a inyectar una implementacion para el metodo (servicio) atentamente Yeiniel On 2013-10-23 05:56, Chema Cortes wrote: > El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa > escribió: > >> Hernan M. F >> Particularmente encuentro el ejemplo que presentas como poco >> elegante. >> Porque en ese caso la clase C tiene una dependencia fija en el >> código al >> método F() de la clase D la cual no puede ser modificada (bueno, si >> puede >> ser modificada empleando settatr(), lo que hace a Python excelente >> desde mi >> punto de vista). La cuestión es que se programa una vez, pero se >> modifica el >> código y se revisa múltiples veces y en este caso el usuario de C >> tiene que >> leer todo el código para darse cuenta de que cambiar si necesita >> reemplazar >> D.F por otra cosa. Y finalmente si F es una función que no dependa >> de que >> argumentos reciba D en el constructor, entonces no es necesario que >> sea >> miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: >> >> class C: >> def __init__(self, f=None): >> if f is None: >> d = D() >> f = d.f >> >> settatr(self, 'f', f) >> >> def f(self): >> raise NotImplementedError() >> >> Esta variante le deja claro al usuario que solo con parametrizar la >> clase C >> puede reemplazar la maquinaria externa que consume la clase. > > Para hacer estas cosas estarían las "clases abstractas". Aunque en > python no es habitual, existe ciertos esfuerzos para introducir > clases > abstractas canalizados a través del módulo 'abc' (Abstract Base > Classes). > > Un modo "recomendable" para hacer este tipo de clases sería: > > import abc > > class C: > __metaclass__=abc.ABCMeta > > def run(self): > self.f() > > @abc.abstractmethod > def f(self): > pass > > Un ejemplo de su uso: > > class D(C): > > def f(self): > other_f() #parcheo > > Si el "consumidor" de la clase olvidase sobrecargar alguno de los > métodos abstractos de la clase, se produciría un error en tiempo de > ejecución. > > >>Finalmente >> quiero decir (mi criterio nuevamente y el de algunas personas que >> asi lo >> ponen en sus blogs) que la herencia multiple no es la forma de >> inyectar >> comportamiento en una clase y que debe ser usada con mucho cuidado. >> Herencia >> es herencia, una persona hereda de animal pero un navegador web no >> hereda de >> conexión de red solo porque la use y la herencia lo pueda hacer >> parecer que >> funciona. > > A la hora de extender una librería, habría que distinguir entre > "especialización" (herencia) e "inyección" (parcheo). Normalmente, la > especialización se hace hace añadiendo una nueva clase al final de la > jerarquía, mientras que la inyección se puede hacer sobre cualquier > nodo de la jerarquía. > > Desde el punto de vista del mantenimiento, cada cambio de la API va a > suponer que el consumidor de la librería tenga que adaptar su código > a > los cambios de API. Estos cambios son más fáciles, casi triviales, en > el caso de la inyección, pero bastante más difíciles con la herencia > si requiere mantener varias ramas paralelas en la jerarquía de > clases. > > Desde el punto de vista del creador de la librería, los decoradores > de > clase son una buena solución para agrupar en un mismo sitio todos los > cambios derivados de un cambio de API. Conceptualmente, en lugar de > modificar la jerarquía de clases con cada cambio, se pondría a > disposición del cliente decoradores para adaptar sus clases a los > cambios de cada API. > > Tal vez, la solución no sea ni especializar ni inyectar, si no una > mezcla de ambas. > > >> >> On 2013-10-22 04:14, Hernan M. F. wrote: >>>> >>>> gracias a todos por el interes. Creo que me ha quedado bastante >>>> claro el >>>> asunto. >>>> >>>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con >>>> la >>>> sintaxis que ha utilizado Juan. >>>> - Sergio, no estoy intentando resolver ningún problema, solamente >>>> estoy "jugando" con los decoradores y viendo de lo que son >>>> capaces. Y >>>> mi pregunta surge desde ese interes. >>>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>>> bien explicas para que son bueno los decoradores y para que no. >>> >>> >>> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >>> >>> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >>> class C (B): >>> def __init__(self): >>> self._f_provider = D() >>> def F(self): >>> self._f_provider.F() >>> >>> Tampoco estás obligado a definir una clase y usar métodos, esto no >>> es >>> Java. >>> F() podría ser un procedimiento o función de un módulo. >>> >>> Con la herencia múltiple de Python (que a veces se nos olvida que >>> tiene), >>> sería: >>> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >>> otros ocho mil >>> problemas nuevos? >>> >>> Y si el problema y el marco de la solución lo merece lo mas formal >>> es usar >>> abc. >>> >>> Keep it simple. ;-) >>> >>>> >>>> El día 21 de octubre de 2013 18:48, Txema Vicente >>>> >>>> escribió: >>>>> >>>>> Buenas. >>>>> >>>>> Aunque puedas usar decoradores para ampliar la clase que decoran, >>>>> yo no >>>>> veo >>>>> los decoradores como sustitutos de la herencia, ni ninguna >>>>> reduccion de >>>>> codigo. >>>>> >>>>> No necesitas decoradores para hacer eso, puedes asignar una >>>>> funcion a un >>>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear >>>>> clases >>>>> decoradas que se amplian en ejecucion, a ver como lo explicas >>>>> luego. >>>>> >>>>> Los decoradores vienen bien, por ejemplo, para "enchufar" >>>>> funciones que >>>>> van >>>>> a manejar algo, como funciones que van a tratar los eventos de un >>>>> GUI, o >>>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que >>>>> quieras >>>>> hacer, sera con una funcion o con una clase, con argumentos o sin >>>>> ellos. >>>>> >>>>> Tambien tienes el decorador @classmethod por si quieres crear >>>>> clases que >>>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o >>>>> actuar >>>>> como "factoria" de clases. >>>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por >>>>> motivos de >>>>> organizacion de API. >>>>> >>>>> La herencia es algo claro y maravilloso que te permite organizar >>>>> las >>>>> cosas. >>>>> El decorador es un "atajo del idioma" para trastear con las >>>>> funciones, >>>>> no >>>>> hay nada que realmente no puedas hacer sin usarlo. >>>>> >>>>> >>>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>>> >>>>> Buenas, >>>>> >>>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y >>>>> tengo >>>>> una duda que quizá alguien me pueda aclarar. >>>>> >>>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>>> heredar desde la clase base ( B ) y crear una nueva clase ( >>>>> llamemosla >>>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>>> normal y corriente. >>>>> >>>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, >>>>> podemos >>>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la >>>>> clase B >>>>> ), añade la funcionalidad F en la clase B sin necesidad de >>>>> herencias >>>>> de ningún tipo. >>>>> >>>>> Visto así, todo parece muy cómodo, se escribe menos código, hay >>>>> menos >>>>> clases implicadas, etc. >>>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta >>>>> practica >>>>> extendida al escribir código en python ( es pythonico y aceptable >>>>> ) ? >>>>> ¿ o es mas una prueba conceptual ? >>>>> >>>>> Gracias de antemano y un saludo. >>>>> >>>>> Ander. >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> -- >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ -- Ing. Yeiniel Suárez Sosa Profesor Instructor, Dep. Automática FIE, UCLV From yeiniel en uclv.cu Wed Oct 23 14:57:40 2013 From: yeiniel en uclv.cu (=?UTF-8?Q?Yeiniel_Su=C3=A1rez_Sosa?=) Date: Wed, 23 Oct 2013 08:57:40 -0400 Subject: [Python-es] =?utf-8?q?=C2=BF_Injecci=C3=B3n_de_c=C3=B3digo_con_de?= =?utf-8?q?coradores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: ahh, me falto decir (haciendo un poco de promocion) que el ejemplo anterior que envie es tomado de https://github.com/yeiniel/aurora atentamente Yeiniel On 2013-10-23 05:54, Ander Garmendia wrote: > Buenos dias, > > para empezar, Yeiniel, por favor, tuteame que si me siento mas viejo > ;) > > Siguiendo con el tema, lo que tenía yo en mente, era el segundo caso > que has citado en el mensaje anterior: esto es B quiere exponer una > funcionalidad F. > > Al respecto, un ejemplo, sería poder añadir conectividad con BBDD > sin > tener que modificar la clase B. El decorador se encargaria de > gestionar la conexión y ejecutar las querys. > > Quizá este no sea el mejor ejemplo ( yo no lo haría de esa manera ) > pero creo que resume bien lo que planteé en el primer mensaje. > Simplificando, el código sería el siguiente: > > class Decor(object): > '''Decora la clase para anadir funcionalidades''' > def __init__(self, arg): > self.arg = arg > print "Clase decoradora" > print self.arg > > def __call__(self, cls): > class Wrapper(cls): > classattr = self.arg > print "En wrapper de clase decoradora" > > def my_method(self, value): > print "New my method {0}, conn string: > {1}".format(value, self.classattr) > > def new_method(self, value): > print "New new method {0}".format(value) > > return Wrapper > > > @Decor('mysql') > class B(object): > def __init__(self, nombre): > self.nombre = nombre > print "Creo objeto B" > > def show_name(self): > print "My nombre es {0}".format(self.izena) > > def __call__(self): > print "Inside call" > > > a = B('Ander') > a.my_method('Ander') > a.new_method('Ander2') > > El código es válido y anade las funciones a la clase decorada, pero > no > me acaba de gustar y es por eso por lo que formulé la pregunta. > > Un saludo. > > Ander. > > El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa > escribió: >> Hola nuevamente >> Yo normalmente no escribo en esta lista, lo cual es malo para la >> comunidad y >> me disculpo, pero estoy haciéndolo ahora porque el tema es teórico y >> merece >> la pena (al menos desde mi punto de vista) lograr buenas prácticas >> en la >> comunidad. >> >> Ander Garmendia >> en el post original usted dice que quiere añadir una funcionalidad F >> a una >> clase B. Aquí es necesario dejar bien claro si el problema es que B >> necesita >> la funcionalidad F para hacer su trabajo o si B tiene que exponer la >> funcionalidad F. En el primer caso estamos tratando con un problema >> de >> dependencia, del cual expuse mi forma de tratarlo. Si el problema es >> que B >> necesita exponer a F, bueno el problema es otro, porque todo depende >> de que >> tipo de elemento es F. La herencia es para crear objetos que son una >> especialización de otro más general, que B herede de C solo es >> correcto si B >> es un caso especifico de C, de lo contrario la herencia no tiene >> sentido. En >> el caso de que B necesite exponer un método de C pero no es una >> especialización de esta clase, entonces el problema todavía es de >> dependencia (composición) y no de herencia. >> >> ahh, se me olvidaba, la sintaxis correcta para inyectar atributos a >> la clase >> es la de Juan, saludos para el >> >> Hernan M. F >> Particularmente encuentro el ejemplo que presentas como poco >> elegante. >> Porque en ese caso la clase C tiene una dependencia fija en el >> código al >> método F() de la clase D la cual no puede ser modificada (bueno, si >> puede >> ser modificada empleando settatr(), lo que hace a Python excelente >> desde mi >> punto de vista). La cuestión es que se programa una vez, pero se >> modifica el >> código y se revisa múltiples veces y en este caso el usuario de C >> tiene que >> leer todo el código para darse cuenta de que cambiar si necesita >> reemplazar >> D.F por otra cosa. Y finalmente si F es una función que no dependa >> de que >> argumentos reciba D en el constructor, entonces no es necesario que >> sea >> miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: >> >> class C: >> def __init__(self, f=None): >> if f is None: >> d = D() >> f = d.f >> >> settatr(self, 'f', f) >> >> def f(self): >> raise NotImplementedError() >> >> Esta variante le deja claro al usuario que solo con parametrizar la >> clase C >> puede reemplazar la maquinaria externa que consume la clase. >> Finalmente >> quiero decir (mi criterio nuevamente y el de algunas personas que >> asi lo >> ponen en sus blogs) que la herencia multiple no es la forma de >> inyectar >> comportamiento en una clase y que debe ser usada con mucho cuidado. >> Herencia >> es herencia, una persona hereda de animal pero un navegador web no >> hereda de >> conexión de red solo porque la use y la herencia lo pueda hacer >> parecer que >> funciona. >> >> Atentamente >> Ing. Yeiniel Suárez Sosa >> Profesor Instructor, Dep. Automática y Sistemas Computacionales >> Facultad de Ingeniería Eléctrica, Universidad Central "Marta Abreu" >> de las >> Villas (UCLV) >> >> >> On 2013-10-22 04:14, Hernan M. F. wrote: >>>> >>>> gracias a todos por el interes. Creo que me ha quedado bastante >>>> claro el >>>> asunto. >>>> >>>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con >>>> la >>>> sintaxis que ha utilizado Juan. >>>> - Sergio, no estoy intentando resolver ningún problema, solamente >>>> estoy "jugando" con los decoradores y viendo de lo que son >>>> capaces. Y >>>> mi pregunta surge desde ese interes. >>>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>>> bien explicas para que son bueno los decoradores y para que no. >>> >>> >>> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >>> >>> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >>> class C (B): >>> def __init__(self): >>> self._f_provider = D() >>> def F(self): >>> self._f_provider.F() >>> >>> Tampoco estás obligado a definir una clase y usar métodos, esto no >>> es >>> Java. >>> F() podría ser un procedimiento o función de un módulo. >>> >>> Con la herencia múltiple de Python (que a veces se nos olvida que >>> tiene), >>> sería: >>> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >>> otros ocho mil >>> problemas nuevos? >>> >>> Y si el problema y el marco de la solución lo merece lo mas formal >>> es usar >>> abc. >>> >>> Keep it simple. ;-) >>> >>>> >>>> El día 21 de octubre de 2013 18:48, Txema Vicente >>>> >>>> escribió: >>>>> >>>>> Buenas. >>>>> >>>>> Aunque puedas usar decoradores para ampliar la clase que decoran, >>>>> yo no >>>>> veo >>>>> los decoradores como sustitutos de la herencia, ni ninguna >>>>> reduccion de >>>>> codigo. >>>>> >>>>> No necesitas decoradores para hacer eso, puedes asignar una >>>>> funcion a un >>>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear >>>>> clases >>>>> decoradas que se amplian en ejecucion, a ver como lo explicas >>>>> luego. >>>>> >>>>> Los decoradores vienen bien, por ejemplo, para "enchufar" >>>>> funciones que >>>>> van >>>>> a manejar algo, como funciones que van a tratar los eventos de un >>>>> GUI, o >>>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que >>>>> quieras >>>>> hacer, sera con una funcion o con una clase, con argumentos o sin >>>>> ellos. >>>>> >>>>> Tambien tienes el decorador @classmethod por si quieres crear >>>>> clases que >>>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o >>>>> actuar >>>>> como "factoria" de clases. >>>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por >>>>> motivos de >>>>> organizacion de API. >>>>> >>>>> La herencia es algo claro y maravilloso que te permite organizar >>>>> las >>>>> cosas. >>>>> El decorador es un "atajo del idioma" para trastear con las >>>>> funciones, >>>>> no >>>>> hay nada que realmente no puedas hacer sin usarlo. >>>>> >>>>> >>>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>>> >>>>> Buenas, >>>>> >>>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y >>>>> tengo >>>>> una duda que quizá alguien me pueda aclarar. >>>>> >>>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>>> heredar desde la clase base ( B ) y crear una nueva clase ( >>>>> llamemosla >>>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>>> normal y corriente. >>>>> >>>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, >>>>> podemos >>>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la >>>>> clase B >>>>> ), añade la funcionalidad F en la clase B sin necesidad de >>>>> herencias >>>>> de ningún tipo. >>>>> >>>>> Visto así, todo parece muy cómodo, se escribe menos código, hay >>>>> menos >>>>> clases implicadas, etc. >>>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta >>>>> practica >>>>> extendida al escribir código en python ( es pythonico y aceptable >>>>> ) ? >>>>> ¿ o es mas una prueba conceptual ? >>>>> >>>>> Gracias de antemano y un saludo. >>>>> >>>>> Ander. >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> -- >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Ing. Yeiniel Suárez Sosa Profesor Instructor, Dep. Automática FIE, UCLV From hfoffani en gmail.com Wed Oct 23 16:20:21 2013 From: hfoffani en gmail.com (=?windows-1252?Q?Hern=E1n_Foffani?=) Date: Wed, 23 Oct 2013 16:20:21 +0200 Subject: [Python-es] =?windows-1252?q?=BF_Injecci=F3n_de_c=F3digo_con_deco?= =?windows-1252?q?radores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: <6D6BB0EA-879F-4CA8-8AED-310EE2709B0F@gmail.com> > Hernan M. F > Particularmente encuentro el ejemplo que presentas como poco elegante. Porque en ese caso la clase C tiene una dependencia fija en el código al método F() de la clase D la cual no puede ser modificada (bueno, si puede ser modificada empleando settatr(), lo que hace a Python excelente desde mi punto de vista). La cuestión es que se programa una vez, pero se modifica el código y se revisa múltiples veces y en este caso el usuario de C tiene que leer todo el código para darse cuenta de que cambiar si necesita reemplazar D.F por otra cosa. Y finalmente si F es una función que no dependa de que argumentos reciba D en el constructor, entonces no es necesario que sea miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: > > class C: > def __init__(self, f=None): > if f is None: > d = D() > f = d.f > > settatr(self, 'f', f) > > def f(self): > raise NotImplementedError() > La dependencia la puedes quitar de forma similar a lo has puesto (inicializa con None, condicionalmente, o como creas mas conveniente). Flexibiliza la firma usando kwargs, etc... class C (B): def __init__(self, f_provider = D()): self._f_provider = f_provider def F(self): self._f_provider.F() Mi respuesta anterior era prevenir el abuso de setattr cuando hay patrones de uso que son mucho mas sencillos y prácticos. Piensa en el caso de uso. Si inyectas vía setattr te impide que puedas ajustar luego el comportamiento. Lo que se suele necesitar en los casos reales es hacer algo antes y/o después de la invocación al suministrador del servicio. Encima si inyectas F a B o C así, ¿cómo accede F a datos internos de B? ? def F(self): hacer_algo_previo_con_self() self._f_provider.F( o_invocar_F_con_alguna_opción_especifica ) hacer_otra_cosa_con_self_con_el_resultado_de_F() > Esta variante le deja claro al usuario que solo con parametrizar la clase C puede reemplazar la maquinaria externa que consume la clase. Finalmente quiero decir (mi criterio nuevamente y el de algunas personas que asi lo ponen en sus blogs) que la herencia multiple no es la forma de inyectar comportamiento en una clase y que debe ser usada con mucho cuidado. Herencia es herencia, una persona hereda de animal pero un navegador web no hereda de conexión de red solo porque la use y la herencia lo pueda hacer parecer que funciona. Es la discusión de décadas y hay opiniones de todo tipo. No voy a entrar en ésta, a no ser que hablemos de casos concreto de código, no tengo intención definir qué es ser. Como dije en mi mensaje anterior lo formal en Python es usar abc. (Ver ejemplo de Chema en un mail posterior). From txema en nabla.net Thu Oct 24 02:12:40 2013 From: txema en nabla.net (Txema Vicente) Date: Thu, 24 Oct 2013 02:12:40 +0200 Subject: [Python-es] =?windows-1252?q?=BF_Injecci=F3n_de_c=F3digo_con_deco?= =?windows-1252?q?radores_o_herencia_=3F?= In-Reply-To: <6D6BB0EA-879F-4CA8-8AED-310EE2709B0F@gmail.com> References: <52655AD1.5040401@nabla.net> <6D6BB0EA-879F-4CA8-8AED-310EE2709B0F@gmail.com> Message-ID: <526865F8.7000907@nabla.net> Buenas. Entiendo que lo que quieres es tener una clase base a la que inyectar métodos para tener distintas maneras de proveer una funcionalidad F. Te haces un decorador para añadir esos metodos al código de la clase cuando se la instancie. Cada vez que instancies un B, Se crea un Decor que te da una subclase llamada Wrapper. Tienes unos objetos B en codigo que crean instancias de Wrapper. Asi que cuando yo haga un repr(), nunca veré un B. Por poder, se podrá, pero aun no veo el motivo para no hacerlo como ya han dicho en el hilo por simple composicion: un atributo B.provider = MySQLProvider() que has inicializado en B.__init__("mysql") y llamas a B.provider.F() O si queda bien el parentesco, haciendo una subclase: hay una class B_MySQL(B) que implementa el método F(). No tengo claro por que no gusta, pero la herencia múltiple está ahí. class B_MySQL(B, MySQLProviderMixin): pass Y unas dudas colaterales: * Por qué tanto setattr(objeto, "atributo", valor)? Si el nombre del atributo ya lo sabemos, para que usar la cadena si vale con objeto.atributo = valor * Que tiene de malo el concepto de clase Mixin, que solo existe para complementar a otra clase? Agur. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Thu Oct 24 02:34:21 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Thu, 24 Oct 2013 02:34:21 +0200 Subject: [Python-es] =?iso-8859-1?q?=BF_Injecci=F3n_de_c=F3digo_con_decora?= =?iso-8859-1?q?dores_o_herencia_=3F?= In-Reply-To: References: <52655AD1.5040401@nabla.net> Message-ID: El día 23 de octubre de 2013 14:53, Yeiniel Suárez Sosa escribió: > Hernan, hola Supongo que en realidad me estás respondiendo a mí. > solo quiero llamarte la atención que en el ejemplo que pones, solo es > posible modificar tu clase C por herencia y no por inyección. Por eso es que > yo no declaro mis componentes abstractos, solo que para crearlos necesitas > pasarles sus dependencias en el constructor o si son opcionales reescribo > los atributos en el objeto. > > Por eso para las dependencias estrictas (las cosas sin las cuales el objeto > no puede funcionar) pondo un estub que simplemente dice que no esta > implementado para forzar al desarrollador a inyectar una implementacion para > el metodo (servicio) Con la clase abstracta tan sólo quería sugerir un modo de resolver estos temas, tanto si vas a usar herencia como inyección. En el caso de la inyección, un modo simple de garantizar que el objeto que se pasa al constructor responde a los métodos requeridos sería ofrecer una clase abstracta para que el usuario la especialice, lo que viene a ser: aplicar un patrón de diseño "Decorador". import abc class D: __metaclass__=abc.ABCMeta @abc.abstractmethod def f(self): pass class C: class _Def(D): def f(self): print "No parcheado" def __init__(self, obj=_Def()): assert(isinstance(obj, D)) self.obj=obj def f(self): self.obj.f() Con ofrecer al cliente la clase abstracta D tendrías asegurado que todo va a ir como se espera. Incluso se puede rizar el rizo añadiendo un decorador a la clase C: def inject(self, fx): class Dx(D): def f(self): fx(self) self.obj=Dx() return fx Y usarlo así: c=C() c.f() #-->No parcheado @c.inject def f(self): print "Parcheado" c.f() #-->Parcheado Seguramente habrá muchas otras formas. > > atentamente > Yeiniel > > > On 2013-10-23 05:56, Chema Cortes wrote: >> >> El día 22 de octubre de 2013 14:50, Yeiniel Suárez Sosa >> escribió: >> >>> Hernan M. F >>> Particularmente encuentro el ejemplo que presentas como poco elegante. >>> Porque en ese caso la clase C tiene una dependencia fija en el código al >>> método F() de la clase D la cual no puede ser modificada (bueno, si puede >>> ser modificada empleando settatr(), lo que hace a Python excelente desde >>> mi >>> punto de vista). La cuestión es que se programa una vez, pero se modifica >>> el >>> código y se revisa múltiples veces y en este caso el usuario de C tiene >>> que >>> leer todo el código para darse cuenta de que cambiar si necesita >>> reemplazar >>> D.F por otra cosa. Y finalmente si F es una función que no dependa de que >>> argumentos reciba D en el constructor, entonces no es necesario que sea >>> miembro de la clase D. Yo pondría tu ejemplo de la siguiente forma: >>> >>> class C: >>> def __init__(self, f=None): >>> if f is None: >>> d = D() >>> f = d.f >>> >>> settatr(self, 'f', f) >>> >>> def f(self): >>> raise NotImplementedError() >>> >>> Esta variante le deja claro al usuario que solo con parametrizar la clase >>> C >>> puede reemplazar la maquinaria externa que consume la clase. >> >> >> Para hacer estas cosas estarían las "clases abstractas". Aunque en >> python no es habitual, existe ciertos esfuerzos para introducir clases >> abstractas canalizados a través del módulo 'abc' (Abstract Base >> Classes). >> >> Un modo "recomendable" para hacer este tipo de clases sería: >> >> import abc >> >> class C: >> __metaclass__=abc.ABCMeta >> >> def run(self): >> self.f() >> >> @abc.abstractmethod >> def f(self): >> pass >> >> Un ejemplo de su uso: >> >> class D(C): >> >> def f(self): >> other_f() #parcheo >> >> Si el "consumidor" de la clase olvidase sobrecargar alguno de los >> métodos abstractos de la clase, se produciría un error en tiempo de >> ejecución. >> >> >>> Finalmente >>> quiero decir (mi criterio nuevamente y el de algunas personas que asi lo >>> ponen en sus blogs) que la herencia multiple no es la forma de inyectar >>> comportamiento en una clase y que debe ser usada con mucho cuidado. >>> Herencia >>> es herencia, una persona hereda de animal pero un navegador web no hereda >>> de >>> conexión de red solo porque la use y la herencia lo pueda hacer parecer >>> que >>> funciona. >> >> >> A la hora de extender una librería, habría que distinguir entre >> "especialización" (herencia) e "inyección" (parcheo). Normalmente, la >> especialización se hace hace añadiendo una nueva clase al final de la >> jerarquía, mientras que la inyección se puede hacer sobre cualquier >> nodo de la jerarquía. >> >> Desde el punto de vista del mantenimiento, cada cambio de la API va a >> suponer que el consumidor de la librería tenga que adaptar su código a >> los cambios de API. Estos cambios son más fáciles, casi triviales, en >> el caso de la inyección, pero bastante más difíciles con la herencia >> si requiere mantener varias ramas paralelas en la jerarquía de clases. >> >> Desde el punto de vista del creador de la librería, los decoradores de >> clase son una buena solución para agrupar en un mismo sitio todos los >> cambios derivados de un cambio de API. Conceptualmente, en lugar de >> modificar la jerarquía de clases con cada cambio, se pondría a >> disposición del cliente decoradores para adaptar sus clases a los >> cambios de cada API. >> >> Tal vez, la solución no sea ni especializar ni inyectar, si no una >> mezcla de ambas. >> >> >>> >>> On 2013-10-22 04:14, Hernan M. F. wrote: >>>>> >>>>> >>>>> gracias a todos por el interes. Creo que me ha quedado bastante claro >>>>> el >>>>> asunto. >>>>> >>>>> - Yeiniel me ha gustado tu solución, solo que yo la utilizaría con la >>>>> sintaxis que ha utilizado Juan. >>>>> - Sergio, no estoy intentando resolver ningún problema, solamente >>>>> estoy "jugando" con los decoradores y viendo de lo que son capaces. Y >>>>> mi pregunta surge desde ese interes. >>>>> - Y enlazando la frase anterior, gracias Txema por tu post, ya que >>>>> bien explicas para que son bueno los decoradores y para que no. >>>> >>>> >>>> >>>> Ten cuidado cuando cambies el comportamiento de objetos al vuelo. >>>> >>>> Si vas a componer clases ¿por qué complicarse?. Usa lo estándar: >>>> class C (B): >>>> def __init__(self): >>>> self._f_provider = D() >>>> def F(self): >>>> self._f_provider.F() >>>> >>>> Tampoco estás obligado a definir una clase y usar métodos, esto no es >>>> Java. >>>> F() podría ser un procedimiento o función de un módulo. >>>> >>>> Con la herencia múltiple de Python (que a veces se nos olvida que >>>> tiene), >>>> sería: >>>> 'class C (B,D)' y no tienes que hacer mas nada. Eso sí, te compras >>>> otros ocho mil >>>> problemas nuevos? >>>> >>>> Y si el problema y el marco de la solución lo merece lo mas formal es >>>> usar >>>> abc. >>>> >>>> Keep it simple. ;-) >>>> >>>>> >>>>> El día 21 de octubre de 2013 18:48, Txema Vicente >>>>> escribió: >>>>>> >>>>>> >>>>>> Buenas. >>>>>> >>>>>> Aunque puedas usar decoradores para ampliar la clase que decoran, yo >>>>>> no >>>>>> veo >>>>>> los decoradores como sustitutos de la herencia, ni ninguna reduccion >>>>>> de >>>>>> codigo. >>>>>> >>>>>> No necesitas decoradores para hacer eso, puedes asignar una funcion a >>>>>> un >>>>>> atributo de la clase (B.F = F). Ademas, como te pongas a crear clases >>>>>> decoradas que se amplian en ejecucion, a ver como lo explicas luego. >>>>>> >>>>>> Los decoradores vienen bien, por ejemplo, para "enchufar" funciones >>>>>> que >>>>>> van >>>>>> a manejar algo, como funciones que van a tratar los eventos de un GUI, >>>>>> o >>>>>> responder en una ruta URL @ruta("/admin"). Dependiendo de lo que >>>>>> quieras >>>>>> hacer, sera con una funcion o con una clase, con argumentos o sin >>>>>> ellos. >>>>>> >>>>>> Tambien tienes el decorador @classmethod por si quieres crear clases >>>>>> que >>>>>> puedan tener casos particulares (miclase = B.ampliada_con_F()), o >>>>>> actuar >>>>>> como "factoria" de clases. >>>>>> Y @staticmethod, que yo solo lo uso en raras ocasiones por motivos de >>>>>> organizacion de API. >>>>>> >>>>>> La herencia es algo claro y maravilloso que te permite organizar las >>>>>> cosas. >>>>>> El decorador es un "atajo del idioma" para trastear con las funciones, >>>>>> no >>>>>> hay nada que realmente no puedas hacer sin usarlo. >>>>>> >>>>>> >>>>>> El 21/10/2013 15:37, Ander Garmendia escribió: >>>>>> >>>>>> Buenas, >>>>>> >>>>>> estoy 'jugando' con decoradores y haciendo diferentes pruebas y tengo >>>>>> una duda que quizá alguien me pueda aclarar. >>>>>> >>>>>> Digamos que tenemos una clase ( llamemosla B ) a la que queremos >>>>>> añadir una funcionalidad (llamemosla F). El método clásico sería >>>>>> heredar desde la clase base ( B ) y crear una nueva clase ( llamemosla >>>>>> C ) que implementase nuestra funcionalidad ( F ). Hasta aquí todo >>>>>> normal y corriente. >>>>>> >>>>>> Ahora llega python y nos ofrece los decoradores, por lo tanto, podemos >>>>>> crear una clase decoradora ( llamemosla D ) que implemente la >>>>>> funcionalidad ( F ) y que decorando una clase ( volvamos a la clase B >>>>>> ), añade la funcionalidad F en la clase B sin necesidad de herencias >>>>>> de ningún tipo. >>>>>> >>>>>> Visto así, todo parece muy cómodo, se escribe menos código, hay menos >>>>>> clases implicadas, etc. >>>>>> Y como todo parece muy bonito, aquí surge mi duda: ¿Está esta practica >>>>>> extendida al escribir código en python ( es pythonico y aceptable ) ? >>>>>> ¿ o es mas una prueba conceptual ? >>>>>> >>>>>> Gracias de antemano y un saludo. >>>>>> >>>>>> Ander. >>>>>> _______________________________________________ >>>>>> Python-es mailing list >>>>>> Python-es en python.org >>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> Python-es mailing list >>>>>> Python-es en python.org >>>>>> https://mail.python.org/mailman/listinfo/python-es >>>>>> FAQ: http://python-es-faq.wikidot.com/ >>>>>> >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> Python-es en python.org >>>>> https://mail.python.org/mailman/listinfo/python-es >>>>> FAQ: http://python-es-faq.wikidot.com/ >>>> >>>> >>>> >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> FAQ: http://python-es-faq.wikidot.com/ >>> >>> >>> >>> -- >>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ > > > -- > Ing. Yeiniel Suárez Sosa > Profesor Instructor, Dep. Automática > FIE, UCLV > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From emmanuelaragona en yahoo.com.ar Thu Oct 24 11:23:33 2013 From: emmanuelaragona en yahoo.com.ar (Emmanuel Aragona) Date: Thu, 24 Oct 2013 02:23:33 -0700 (PDT) Subject: [Python-es] OT- Necesito un colaborador In-Reply-To: References: <1380824917.59683.YahooMailNeo@web125605.mail.ne1.yahoo.com> Message-ID: <1382606613.29531.YahooMailNeo@web121103.mail.ne1.yahoo.com> Enviame lo que tienes hecho... El día viernes, 18 de octubre de 2013 4:49, Alberto Curro escribió: Perdón por la respuesta off-topic, pero es que tu correo me ha recordado varias frases que un compañero mío decía continuamente, como que "cuando dices que tienes el 95% de la aplicación hecha, el 5%  restante te llevará el 95% del tiempo". Sólo viendo algunos de los puntos que comentas, tienes una pequeña aplicación desarrollada, y otra por desarrollar; sólo el tema de los múltiples almacenes y el traspaso entre ellos, desde mi experiencia, te apuesto a que te/os implicará una refactorización profunda, o directamente una reescritura completa de la base de la aplicación.     Suerte con la busqueda de candidato, pero como consejo, en este tipo de anuncios deberías comentar los términos de la "colaboración" (retribución, etc.), eso seguro que haría que la gente se pudiese sentir más interesada, porque tal y como lo comentas, lo que veo es que buscas gente que trabaje gratis en algo que, a priori, parece comercial.  Saludos  Alberto  PD: Mis humildes disculpas también por el top-posting :) El 3 de octubre de 2013 19:28, Eliezer Gallegos escribió: Hola Gente: >perdon por el OT... >Estoy en la busqueda de alguien que me pueda colaborar para terminar una >Aplicacion de Gestion ya hecha en... Python+wxPython+MySql+Boa-Constructor >y correrá en Windows de todo tipo.... >la Aplicacion ya está casi en su totalidad...... >Que necesito...? >alguien con experiencia en éste tipo de Aplicaciones (Compras/Facturacion/Inv.)..etc >Porque....? >porque necesito agregar cosas puntuales como: >valorizar el Inventario a Costo Promedio... >agregar que pueda manejar varias sucursales...y varios almacenes. >hacer traspasos de productos/articulos entre almacenes... >hacer un modulo para la toma de Inventario Fisico... >necesito agregar la Facturacion Electronica..... (ésto si no se puede no hay problema) >y una gran lista de cosas, que necesito para entrar a Produccion lo mas pronto posible... >estoy en Mexico....... >si alguien se interesa estoy a su disposicion, para platicarlo >mas ampliamente por medio de mi correo...egirun.yahoo.com > >Reciban Saludos >Eliezer Gallegos >  >_______________________________________________ >Python-es mailing list >Python-es en python.org >https://mail.python.org/mailman/listinfo/python-es >FAQ: http://python-es-faq.wikidot.com/ > > _______________________________________________ Python-es mailing list Python-es en python.org https://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From alfredo.riguetti en ptravel.com.uy Fri Oct 25 17:11:24 2013 From: alfredo.riguetti en ptravel.com.uy (Alfredo Riguetti) Date: Fri, 25 Oct 2013 13:11:24 -0200 Subject: [Python-es] Capturar linea en ListCtrl Message-ID: <526A8A1C.2000907@ptravel.com.uy> Hola a todos, espero vuestra ayuda. tengo un ListCtrl andando, pero me surgio una duda, tengo alguna forma en un listado de clientes que estoy mosytrando , como capturar el registro que esta seleccionado. espero vuestra ayuda. Muchas Gracias Alfredo From hfoffani en gmail.com Fri Oct 25 17:43:58 2013 From: hfoffani en gmail.com (=?windows-1252?Q?Hern=E1n_Foffani?=) Date: Fri, 25 Oct 2013 17:43:58 +0200 Subject: [Python-es] =?windows-1252?q?=BF_Injecci=F3n_de_c=F3digo_con_deco?= =?windows-1252?q?radores_o_herencia_=3F?= In-Reply-To: <526865F8.7000907@nabla.net> References: <52655AD1.5040401@nabla.net> <6D6BB0EA-879F-4CA8-8AED-310EE2709B0F@gmail.com> <526865F8.7000907@nabla.net> Message-ID: <61AEC73C-E571-4A41-ABE9-664DE3AD62A9@gmail.com> > Y unas dudas colaterales: > > * Por qué tanto setattr(objeto, "atributo", valor)? > Si el nombre del atributo ya lo sabemos, para que usar la cadena si > vale con objeto.atributo = valor > En los ejemplos de este hilo es lo mismo. > * Que tiene de malo el concepto de clase Mixin, que solo existe para > complementar a otra clase? > Ninguno de por sí. Es mas, es un patrón perfectamente válido para los lenguajes de programación que admiten herencia múltiple. Existe desde hace décadas y en la biblioteca estándar de Python se usa bastante. Con todo se pueden cometer abusos y mas con Python por la libertad que permite. El problema mas común es cuando los mixins tienen cantidades elevadas de métodos. Controlar aquí la resolución de conflictos es complicado porque suele ser difícil de diagnosticar y mas aún de corregir. Plone y las primera versión de Zope contribuyeron a su desprestigio, pero son casos especiales, frameworks gigantes, y aquí sí concuerdo con la idea que los mixins no son el mecanismo adecuado. Una regla simplona es que mientras la suma de las cantidades de nombres a incorporar de todos los mixins no supere la docena estás dentro de la zona segura. Saludos, Hernán. From txema en nabla.net Sat Oct 26 19:12:22 2013 From: txema en nabla.net (Txema Vicente) Date: Sat, 26 Oct 2013 19:12:22 +0200 Subject: [Python-es] Capturar linea en ListCtrl In-Reply-To: <526A8A1C.2000907@ptravel.com.uy> References: <526A8A1C.2000907@ptravel.com.uy> Message-ID: <526BF7F6.4080702@nabla.net> Buenas. Si hablas de wxpython, prueba con el método GetFirstSelected (y luego GetNextSelected si es múltiple) [1] Lo tengo un poco frío pero si no recuerdo mal también te viene en el evento cuando se selecciona. Pones una funcion a atender el evento con textctrl.Bind(wx.EVT_CHOICE, OnSelect) y ya puedes saber qué se ha seleccionado cuando lo recibas: def OnSelect(event): selected = event.GetEventObject().GetStringSelection() [1]: http://www.wxpython.org/docs/api/wx.ListCtrl-class.html El 25/10/2013 17:11, Alfredo Riguetti escribió: > Hola a todos, espero vuestra ayuda. > tengo un ListCtrl andando, pero me surgio una duda, tengo alguna forma > en un listado de clientes que estoy mosytrando , como capturar el > registro que esta seleccionado. > > espero vuestra ayuda. > > Muchas Gracias > > Alfredo > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From kausdiv en gmail.com Sat Oct 26 19:34:09 2013 From: kausdiv en gmail.com (kausdiv) Date: Sat, 26 Oct 2013 19:34:09 +0200 Subject: [Python-es] Practica con lista de diccionarios. Message-ID: <526BFD11.9000103@gmail.com> Se ha borrado un adjunto en formato HTML... URL: From jespinog en gmail.com Sat Oct 26 19:41:40 2013 From: jespinog en gmail.com (=?ISO-8859-1?Q?Jes=FAs_Espino?=) Date: Sat, 26 Oct 2013 19:41:40 +0200 Subject: [Python-es] Practica con lista de diccionarios. In-Reply-To: <526BFD11.9000103@gmail.com> References: <526BFD11.9000103@gmail.com> Message-ID: Hola, Esto se debe a que en python los diccionarios no están ordenados, si quieres tener el mismo efecto que un diccionario ordenado puedes usar o una lista de tuplas, o mejor aun OrderedDict del modulo collections [1]. Un saludo. [1] http://docs.python.org/2/library/collections.html#ordereddict-objects 2013/10/26 kausdiv > Hola amigos. > > Estoy haciendo para practicar una especie de lista de contactos. > Estoy haciendo con una lista de diccionarios que guardo y abro con pickle. > > Ejemplo de estructura: > d = [{'Nombre': 'Antonio','Apellidos': 'F. F.'}, > {'Nombre': 'Maria','Apellidos': 'A. P.','Ciudad': 'GR','Movil': ' > 600000000'}, > {'Nombre': 'Esther','Apellidos': 'L. R.','Movil': '600111111', > 'Tipo':'Android'} ] > > La idea es que cada nodo pueda tener x campos no fijos. (En el futuro será > una base de datos mongoDB) > * > **Problema:* Cuando listo, los campos (clave:valor) no salen en el mismo > orden que están introducidos: ( pego el prodedimiento de impresión y el > resultado) ¿ Como puedo solucionarlo para que se impriman las claves en el > mismo orden que se meten ? > > def listar_todo(d): > i=0 > for n in d: > print "-----------< Elemento %i >----------" % i > i+=1 > for g in n.keys(): > print "%s \t%s" % (g, n[g]) > --------------------------------------------------------------- > > -----------< Elemento 0 >---------- > Apellidos F. F. > Nombre Antonio > -----------< Elemento 1 >---------- > Apellidos A. P. > Nombre Maria > Ciudad GR > Movil 600000000 > -----------< Elemento 2 >---------- > Apellidos L. R. > Nombre Esther > Movil 600111111 > Tipo Android > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From oscar.carballal en gmail.com Sat Oct 26 19:45:30 2013 From: oscar.carballal en gmail.com (Oscar Carballal) Date: Sat, 26 Oct 2013 19:45:30 +0200 Subject: [Python-es] Practica con lista de diccionarios. In-Reply-To: <526BFD11.9000103@gmail.com> References: <526BFD11.9000103@gmail.com> Message-ID: En vez de usar un diccionario estandar (que no soporta ordenacion) utiliza OrderedDict(). Te dejo el enlace a la documentacion: http://docs.python.org/2/library/collections.html#ordereddict-objects Regards, Oscar -- Oscar Carballal Prego Software developer oscar.carballal en gmail.com El 26 de octubre de 2013 19:34, kausdiv escribió: > Hola amigos. > > Estoy haciendo para practicar una especie de lista de contactos. > Estoy haciendo con una lista de diccionarios que guardo y abro con pickle. > > Ejemplo de estructura: > d = [{'Nombre': 'Antonio','Apellidos': 'F. F.'}, > {'Nombre': 'Maria','Apellidos': 'A. P.','Ciudad': 'GR','Movil': > '600000000'}, > {'Nombre': 'Esther','Apellidos': 'L. R.','Movil': '600111111', > 'Tipo':'Android'} ] > > La idea es que cada nodo pueda tener x campos no fijos. (En el futuro será > una base de datos mongoDB) > * > **Problema:* Cuando listo, los campos (clave:valor) no salen en el mismo > orden que están introducidos: ( pego el prodedimiento de impresión y el > resultado) ¿ Como puedo solucionarlo para que se impriman las claves en el > mismo orden que se meten ? > > def listar_todo(d): > i=0 > for n in d: > print "-----------< Elemento %i >----------" % i > i+=1 > for g in n.keys(): > print "%s \t%s" % (g, n[g]) > --------------------------------------------------------------- > > -----------< Elemento 0 >---------- > Apellidos F. F. > Nombre Antonio > -----------< Elemento 1 >---------- > Apellidos A. P. > Nombre Maria > Ciudad GR > Movil 600000000 > -----------< Elemento 2 >---------- > Apellidos L. R. > Nombre Esther > Movil 600111111 > Tipo Android > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From davidmenhur en gmail.com Mon Oct 28 12:20:55 2013 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Mon, 28 Oct 2013 12:20:55 +0100 Subject: [Python-es] =?iso-8859-1?q?Almacenamiento_en_disco_autom=E1tico_y?= =?iso-8859-1?q?_transparente?= Message-ID: Tengo un objeto Python (pongamos una cadena de texto o un array de numpy) que puede crecer arbitrariamente, hasta, quizá, superar el límite de memoria del SO. Quiero mantenerla en memoria mientras sea posible, pero si llegara a crecer por encima de un cierto límite, se almacenaría en disco. El programa, sin embargo, vería el mismo objeto, y sería capaz de leer valores de la misma forma. ¿Es esto posible? Con una cadena lo veo más o menos factible, sobrecargando los métodos que la extenderían para que, si supera el límite de memoria, vuelque a archivo; e igualmente los métodos __getitem__ fueran redirigidos a seek() y read(). Con un array, quizá me iría a EArray (extendable array) de PyTables. ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? /David. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From alfredo.riguetti en ptravel.com.uy Mon Oct 28 12:39:48 2013 From: alfredo.riguetti en ptravel.com.uy (Alfredo Riguetti) Date: Mon, 28 Oct 2013 09:39:48 -0200 Subject: [Python-es] Capturar linea en ListCtrl In-Reply-To: <526BF7F6.4080702@nabla.net> References: <526A8A1C.2000907@ptravel.com.uy> <526BF7F6.4080702@nabla.net> Message-ID: <526E4D04.3060700@ptravel.com.uy> Se ha borrado un adjunto en formato HTML... URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: gráficos1 Type: image/jpeg Size: 30735 bytes Desc: no disponible URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: telefononegro.png Type: image/png Size: 807 bytes Desc: no disponible URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: sobre4.jpg Type: image/jpeg Size: 3250 bytes Desc: no disponible URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: mundito3.png Type: image/png Size: 10514 bytes Desc: no disponible URL: From kikocorreoso en gmail.com Mon Oct 28 12:45:16 2013 From: kikocorreoso en gmail.com (Kiko) Date: Mon, 28 Oct 2013 12:45:16 +0100 Subject: [Python-es] =?iso-8859-1?q?Almacenamiento_en_disco_autom=E1tico_y?= =?iso-8859-1?q?_transparente?= In-Reply-To: References: Message-ID: El 28 de octubre de 2013 12:20, Da?id escribió: > Tengo un objeto Python (pongamos una cadena de texto o un array de numpy) > que puede crecer arbitrariamente, hasta, quizá, superar el límite de > memoria del SO. Quiero mantenerla en memoria mientras sea posible, pero si > llegara a crecer por encima de un cierto límite, se almacenaría en disco. > El programa, sin embargo, vería el mismo objeto, y sería capaz de leer > valores de la misma forma. ¿Es esto posible? > > Con una cadena lo veo más o menos factible, sobrecargando los métodos que > la extenderían para que, si supera el límite de memoria, vuelque a archivo; > e igualmente los métodos __getitem__ fueran redirigidos a seek() y read(). > Con un array, quizá me iría a EArray (extendable array) de PyTables. > > ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? > > Si los datos son lo suficientemente grandes como para que no quepan en memoria las opciones lógicas que se me ocurren son netCDF4 y/o HDF5. Si lo que interesa es la eficiencia de acceso a datos, dependiendo de como vayas acceder a tus datos sería mejor uno u otro formato. Por ejemplo, netCDF4 está optimizado para acceder a pequeñas partes de datos de un fichero más grande de forma eficiente y sin necesidad de cargar toda la info en memoria. También existen parallel-netCDF4 y parallel-HDF5 para optimizar cosas pero son cosas que nunca he usado. Le puedes echar un ojo a google. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From faltet en gmail.com Mon Oct 28 13:26:27 2013 From: faltet en gmail.com (Francesc Alted) Date: Mon, 28 Oct 2013 13:26:27 +0100 Subject: [Python-es] =?utf-8?q?Almacenamiento_en_disco_autom=C3=A1tico_y_t?= =?utf-8?q?ransparente?= In-Reply-To: References: Message-ID: <526E57F3.5050408@gmail.com> On 10/28/13, 12:20 PM, Da?id wrote: > Tengo un objeto Python (pongamos una cadena de texto o un array de > numpy) que puede crecer arbitrariamente, hasta, quizá, superar el > límite de memoria del SO. Quiero mantenerla en memoria mientras sea > posible, pero si llegara a crecer por encima de un cierto límite, se > almacenaría en disco. El programa, sin embargo, vería el mismo objeto, > y sería capaz de leer valores de la misma forma. ¿Es esto posible? > > Con una cadena lo veo más o menos factible, sobrecargando los métodos > que la extenderían para que, si supera el límite de memoria, vuelque a > archivo; e igualmente los métodos __getitem__ fueran redirigidos a > seek() y read(). Con un array, quizá me iría a EArray (extendable > array) de PyTables. Si, yo creo que un EArray sobrecargado te puede servir perfectamente para eso. > > ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? Hombre, no se exactamente para que quieres cargar lo mas possible el array en memoria, pero en esos casos yo lo que haria es guardar todo el array en disco y dejar que sea el sistema operativo, y no tu, quien decida que partes se cachean en memoria. A la larga es mas practico y eficiente. -- Francesc Alted From davidmenhur en gmail.com Mon Oct 28 13:49:45 2013 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Mon, 28 Oct 2013 13:49:45 +0100 Subject: [Python-es] =?iso-8859-1?q?Almacenamiento_en_disco_autom=E1tico_y?= =?iso-8859-1?q?_transparente?= In-Reply-To: References: Message-ID: 2013/10/28 Kiko > Si los datos son lo suficientemente grandes como para que no quepan en > memoria El problema es que, en principio, no sé si va a ser así. Depende de los datos en concreto y de la RAM instalada en la máquina (cualquier cosa entre 4 y 16 GB). Me gustaría poder evitar el disco mientras fuera posible, pero sin que el programa sea asesinado. 2013/10/28 Francesc Alted > ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? >> > > Hombre, no se exactamente para que quieres cargar lo mas possible el array > en memoria, pero en esos casos yo lo que haria es guardar todo el array en > disco y dejar que sea el sistema operativo, y no tu, quien decida que > partes se cachean en memoria. A la larga es mas practico y eficiente. Cierto, me olvidaba de la caché. Mi idea iba más por usar, digamos, "backend en memoria" hasta que llegara a un cierto límite, en el que pasaría a guardarse en disco. Pero quizá, usando directamente la opción en disco, el SO mantendrá el contenido en caché mientras sea lo suficientemente pequeño, y el rendimiento será lo suficientemente bueno. Otra opción sería carray, que tiene la ventaja de ofrecer exactamente la misma API para memoria que para disco. http://carray.pytables.org/docs/manual/tutorial.html Veré cuál se ajusta más a mis especificaciones. Gracias por las ideas. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From faltet en gmail.com Mon Oct 28 14:58:03 2013 From: faltet en gmail.com (Francesc Alted) Date: Mon, 28 Oct 2013 14:58:03 +0100 Subject: [Python-es] =?utf-8?q?Almacenamiento_en_disco_autom=C3=A1tico_y_t?= =?utf-8?q?ransparente?= In-Reply-To: References: Message-ID: <526E6D6B.8080906@gmail.com> On 10/28/13, 1:49 PM, Da?id wrote: > 2013/10/28 Kiko > > > Si los datos son lo suficientemente grandes como para que no > quepan en memoria > > > El problema es que, en principio, no sé si va a ser así. Depende de > los datos en concreto y de la RAM instalada en la máquina (cualquier > cosa entre 4 y 16 GB). Me gustaría poder evitar el disco mientras > fuera posible, pero sin que el programa sea asesinado. Creeme, a no ser que tengas requerimientos muy precisos, mucho mejor que se encargue el SO. > > > > 2013/10/28 Francesc Alted > > > ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? > > > Hombre, no se exactamente para que quieres cargar lo mas possible > el array en memoria, pero en esos casos yo lo que haria es guardar > todo el array en disco y dejar que sea el sistema operativo, y no > tu, quien decida que partes se cachean en memoria. A la larga es > mas practico y eficiente. > > > Cierto, me olvidaba de la caché. Mi idea iba más por usar, digamos, > "backend en memoria" hasta que llegara a un cierto límite, en el que > pasaría a guardarse en disco. Pero quizá, usando directamente la > opción en disco, el SO mantendrá el contenido en caché mientras sea lo > suficientemente pequeño, y el rendimiento será lo suficientemente bueno. > > Otra opción sería carray, que tiene la ventaja de ofrecer exactamente > la misma API para memoria que para disco. > > http://carray.pytables.org/docs/manual/tutorial.html > > Veré cuál se ajusta más a mis especificaciones. Gracias por las ideas. Bueno, yo tambien habia pensado en carray :). De todas maneras, el carray lo tengo medio abandonado porque basicamente lo hemos integrado como un subpaquete en el proyecto Blaze (blaze.pydata.org). El subpaquete se llama BLZ (blaze.blz), y se trata basicamente de carray, aunque con algunos retoques y mejoras. El manual de BLZ no lo encontraras en la web de Blaze ya que esta pensado para no ser visible directamente por el usuario final, sino mas bien como una forma de almacenaje mas de Blaze. Pero basicamente se puede tomar el manual de carray y reemplazando `carray` por `barray` y `ctable` por `btable` mas o menos todo deberia funcionar tal cual. -- Francesc Alted From shaddycls en gmail.com Mon Oct 28 15:27:03 2013 From: shaddycls en gmail.com (Sherab Giovannini) Date: Mon, 28 Oct 2013 15:27:03 +0100 Subject: [Python-es] =?iso-8859-1?q?Almacenamiento_en_disco_autom=E1tico_y?= =?iso-8859-1?q?_transparente?= In-Reply-To: References: Message-ID: Buenas, Lo que pides ya se gestiona mediante la paginación, tanto en Windows (pagefile) como en Linux (swapping). Siempre puedes forzar al OS a no volcar a disco las páginas que exceden el límite de memoria y hacerte tu un driver que lo haga. Porque desde Python no se como podrías gestionarlo, y ya te digo que no vas a reinventar la rueda. Más óptimo que el diseño del OS difícilmente lo vas a conseguir. El 28 de octubre de 2013 12:20, Da?id escribió: > Tengo un objeto Python (pongamos una cadena de texto o un array de numpy) > que puede crecer arbitrariamente, hasta, quizá, superar el límite de > memoria del SO. Quiero mantenerla en memoria mientras sea posible, pero si > llegara a crecer por encima de un cierto límite, se almacenaría en disco. > El programa, sin embargo, vería el mismo objeto, y sería capaz de leer > valores de la misma forma. ¿Es esto posible? > > Con una cadena lo veo más o menos factible, sobrecargando los métodos que > la extenderían para que, si supera el límite de memoria, vuelque a archivo; > e igualmente los métodos __getitem__ fueran redirigidos a seek() y read(). > Con un array, quizá me iría a EArray (extendable array) de PyTables. > > ¿Hay algo ya hecho? ¿Alguna idea más inteligente y eficiente? > > > /David. > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ > > -- HomePage @ Research Labs [AbsshA's Blog ] [PGP Public Key ] ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Mon Oct 28 21:37:07 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Mon, 28 Oct 2013 16:37:07 -0400 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. Message-ID: Hola, quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. Siguiendo cierta informacion que encontre en stackoverflow, lo que es implementado es lo siguiente: logging.TRACE = 5 logging.addLevelName(logging.TRACE, 'TRACE') def trace(self, msg, *args, **kwargs): self._log(logging.TRACE, msg, args, **kwargs) logging.Logger.trace = trace y depues de eso ya hago lo normal log = logging.getLogger() .... El unico problema es que siempre ejecuta las llamadas a log.trace(), independiente de el nivel de log. Por ejemplo, si hago log.setLevel ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, ERROR y CRITICAL, pero tambien TRACE. Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? Si alguien tiene una pista de porque no respeta el valor 5 y se ejecuta siempre, cualquier comentario sera mas que bienvenido. Muchas gracias por adelantado. Jose From pych3m4 en gmail.com Tue Oct 29 03:41:06 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Tue, 29 Oct 2013 03:41:06 +0100 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. In-Reply-To: References: Message-ID: El día 28 de octubre de 2013 21:37, Jose Caballero escribió: > Hola, > > > quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. > Siguiendo cierta informacion que encontre en stackoverflow, lo que es > implementado es lo siguiente: > > > logging.TRACE = 5 > logging.addLevelName(logging.TRACE, 'TRACE') > def trace(self, msg, *args, **kwargs): > self._log(logging.TRACE, msg, args, **kwargs) > logging.Logger.trace = trace _log envía el mensaje al logger sin chequear los niveles. Usa Logger.log en su lugar: def trace(self, msg, *args, **kwargs): self.log(logging.TRACE, msg, *args, **kwargs) No veo clara la implementación que estás haciendo, con modificaciones tanto del módulo logging como de la clase Logger/RootLogger. Sin volver a la discursión de estos días sobre especializar o parchear clases, deberías derivar tu propia clase de Logger en vez de usar el logger root. Parcheando así podrías tener problemas con el multiproceso. import logging class MyLogger(logging.getLoggerClass()): TRACE = 5 logging.addLevelName(TRACE, "TRACE") def trace(self, msg, *args, **kwargs): self.log(self.TRACE, msg, *args, **kwargs) logging.setLoggerClass(MyLogger) logger = logging.getLogger(__name__) logger.addHandler(logging.StreamHandler()) logger.setLevel("TRACE") logger.trace("hi") logger.setLevel("INFO") logger.trace("hi") > > > y depues de eso ya hago lo normal > > log = logging.getLogger() > .... > > > El unico problema es que siempre ejecuta las llamadas a log.trace(), > independiente de el nivel de log. Por ejemplo, si hago log.setLevel > ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, > ERROR y CRITICAL, pero tambien TRACE. > Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? > > Si alguien tiene una pista de porque no respeta el valor 5 y se > ejecuta siempre, cualquier comentario sera mas que bienvenido. > > > Muchas gracias por adelantado. > Jose > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From jcaballero.hep en gmail.com Tue Oct 29 10:26:29 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Tue, 29 Oct 2013 05:26:29 -0400 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. In-Reply-To: References: Message-ID: <5EA3F7E8-5C90-461A-B8A4-85B7FF45243F@gmail.com> Hola, probaré a usar self.log() como sugieres. La razón por la que lo hago en el logger root es porque la aplicación está compuesta por varios módulos y plugins, incluyendo los que los usuarios puedan escribir por su cuenta sin yo saberlo. Quiero que al hacer log = getLogger("foo") al comienzo de cada módulo y cada plugin, el objeto log contenga el método trace(). Tu sugerencia es correcta, pero si alguien olvida usar la clase ad-hoc MyLogger pierde la nueva funcionalidad. Creo. O tal vez es que aún no entiendo bien las clases de log. Probaré tu sugerencia en cualquier caso. Muchas gracias por la respuesta y los comentarios. Saludos, Jose On Oct 28, 2013, at 22:41, Chema Cortes wrote: > El día 28 de octubre de 2013 21:37, Jose Caballero > escribió: >> Hola, >> >> >> quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. >> Siguiendo cierta informacion que encontre en stackoverflow, lo que es >> implementado es lo siguiente: >> >> >> logging.TRACE = 5 >> logging.addLevelName(logging.TRACE, 'TRACE') >> def trace(self, msg, *args, **kwargs): >> self._log(logging.TRACE, msg, args, **kwargs) >> logging.Logger.trace = trace > > _log envía el mensaje al logger sin chequear los niveles. Usa > Logger.log en su lugar: > > def trace(self, msg, *args, **kwargs): > self.log(logging.TRACE, msg, *args, **kwargs) > > No veo clara la implementación que estás haciendo, con modificaciones > tanto del módulo logging como de la clase Logger/RootLogger. Sin > volver a la discursión de estos días sobre especializar o parchear > clases, deberías derivar tu propia clase de Logger en vez de usar el > logger root. Parcheando así podrías tener problemas con el > multiproceso. > > import logging > > class MyLogger(logging.getLoggerClass()): > > TRACE = 5 > logging.addLevelName(TRACE, "TRACE") > > def trace(self, msg, *args, **kwargs): > self.log(self.TRACE, msg, *args, **kwargs) > > logging.setLoggerClass(MyLogger) > > logger = logging.getLogger(__name__) > logger.addHandler(logging.StreamHandler()) > > logger.setLevel("TRACE") > logger.trace("hi") > > logger.setLevel("INFO") > logger.trace("hi") > >> >> >> y depues de eso ya hago lo normal >> >> log = logging.getLogger() >> .... >> >> >> El unico problema es que siempre ejecuta las llamadas a log.trace(), >> independiente de el nivel de log. Por ejemplo, si hago log.setLevel >> ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, >> ERROR y CRITICAL, pero tambien TRACE. >> Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? >> >> Si alguien tiene una pista de porque no respeta el valor 5 y se >> ejecuta siempre, cualquier comentario sera mas que bienvenido. >> >> >> Muchas gracias por adelantado. >> Jose >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > http://ch3m4.org/blog > Buscador Python Hispano: http://ch3m4.org/python-es > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From pych3m4 en gmail.com Tue Oct 29 12:38:55 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Tue, 29 Oct 2013 12:38:55 +0100 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. In-Reply-To: <5EA3F7E8-5C90-461A-B8A4-85B7FF45243F@gmail.com> References: <5EA3F7E8-5C90-461A-B8A4-85B7FF45243F@gmail.com> Message-ID: El día 29 de octubre de 2013 10:26, Jose Caballero escribió: > Hola, > > probaré a usar self.log() como sugieres. > > La razón por la que lo hago en el logger root es porque la aplicación está compuesta por varios módulos y plugins, incluyendo los que los usuarios puedan escribir por su cuenta sin yo saberlo. Quiero que al hacer log = getLogger("foo") al comienzo de cada módulo y cada plugin, el objeto log contenga el método trace(). > Tu sugerencia es correcta, pero si alguien olvida usar la clase ad-hoc MyLogger pierde la nueva funcionalidad. Creo. > O tal vez es que aún no entiendo bien las clases de log. Probaré tu sugerencia en cualquier caso. Prueba. "Multiple calls to getLogger() with the same name will always return a reference to the same Logger object." Se puede decir que los loggers funcionan como singletons siempre que los instancies desde getLogger. LLamando a setLoggerClass() al inicio, todas las instancias de Logger que se creen a partir de entonces llevarán el método trace. Así mismo, ésta la razón por la que hay que usar getLoggerClass() para obtener la clase a especializar (tal como hace mi código). > > Muchas gracias por la respuesta y los comentarios. > > Saludos, > Jose > > > On Oct 28, 2013, at 22:41, Chema Cortes wrote: > >> El día 28 de octubre de 2013 21:37, Jose Caballero >> escribió: >>> Hola, >>> >>> >>> quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. >>> Siguiendo cierta informacion que encontre en stackoverflow, lo que es >>> implementado es lo siguiente: >>> >>> >>> logging.TRACE = 5 >>> logging.addLevelName(logging.TRACE, 'TRACE') >>> def trace(self, msg, *args, **kwargs): >>> self._log(logging.TRACE, msg, args, **kwargs) >>> logging.Logger.trace = trace >> >> _log envía el mensaje al logger sin chequear los niveles. Usa >> Logger.log en su lugar: >> >> def trace(self, msg, *args, **kwargs): >> self.log(logging.TRACE, msg, *args, **kwargs) >> >> No veo clara la implementación que estás haciendo, con modificaciones >> tanto del módulo logging como de la clase Logger/RootLogger. Sin >> volver a la discursión de estos días sobre especializar o parchear >> clases, deberías derivar tu propia clase de Logger en vez de usar el >> logger root. Parcheando así podrías tener problemas con el >> multiproceso. >> >> import logging >> >> class MyLogger(logging.getLoggerClass()): >> >> TRACE = 5 >> logging.addLevelName(TRACE, "TRACE") >> >> def trace(self, msg, *args, **kwargs): >> self.log(self.TRACE, msg, *args, **kwargs) >> >> logging.setLoggerClass(MyLogger) >> >> logger = logging.getLogger(__name__) >> logger.addHandler(logging.StreamHandler()) >> >> logger.setLevel("TRACE") >> logger.trace("hi") >> >> logger.setLevel("INFO") >> logger.trace("hi") >> >>> >>> >>> y depues de eso ya hago lo normal >>> >>> log = logging.getLogger() >>> .... >>> >>> >>> El unico problema es que siempre ejecuta las llamadas a log.trace(), >>> independiente de el nivel de log. Por ejemplo, si hago log.setLevel >>> ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, >>> ERROR y CRITICAL, pero tambien TRACE. >>> Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? >>> >>> Si alguien tiene una pista de porque no respeta el valor 5 y se >>> ejecuta siempre, cualquier comentario sera mas que bienvenido. >>> >>> >>> Muchas gracias por adelantado. >>> Jose >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> -- >> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >> http://ch3m4.org/blog >> Buscador Python Hispano: http://ch3m4.org/python-es >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es From jcaballero.hep en gmail.com Tue Oct 29 16:54:51 2013 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Tue, 29 Oct 2013 11:54:51 -0400 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. In-Reply-To: References: Message-ID: Hola de nuevo, acabo de probar tus sugerencias. 1. using self.log() en lugar de self._log() parece funcionar bien 2. usando la clase MyLogger() funciona, siempre y cuando en el core de la aplicacion no se llame nunca al logger root, que es el caso actual. Muchas gracias por todo, Jose El día 28 de octubre de 2013 22:41, Chema Cortes escribió: > El día 28 de octubre de 2013 21:37, Jose Caballero > escribió: >> Hola, >> >> >> quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. >> Siguiendo cierta informacion que encontre en stackoverflow, lo que es >> implementado es lo siguiente: >> >> >> logging.TRACE = 5 >> logging.addLevelName(logging.TRACE, 'TRACE') >> def trace(self, msg, *args, **kwargs): >> self._log(logging.TRACE, msg, args, **kwargs) >> logging.Logger.trace = trace > > _log envía el mensaje al logger sin chequear los niveles. Usa > Logger.log en su lugar: > > def trace(self, msg, *args, **kwargs): > self.log(logging.TRACE, msg, *args, **kwargs) > > No veo clara la implementación que estás haciendo, con modificaciones > tanto del módulo logging como de la clase Logger/RootLogger. Sin > volver a la discursión de estos días sobre especializar o parchear > clases, deberías derivar tu propia clase de Logger en vez de usar el > logger root. Parcheando así podrías tener problemas con el > multiproceso. > > import logging > > class MyLogger(logging.getLoggerClass()): > > TRACE = 5 > logging.addLevelName(TRACE, "TRACE") > > def trace(self, msg, *args, **kwargs): > self.log(self.TRACE, msg, *args, **kwargs) > > logging.setLoggerClass(MyLogger) > > logger = logging.getLogger(__name__) > logger.addHandler(logging.StreamHandler()) > > logger.setLevel("TRACE") > logger.trace("hi") > > logger.setLevel("INFO") > logger.trace("hi") > >> >> >> y depues de eso ya hago lo normal >> >> log = logging.getLogger() >> .... >> >> >> El unico problema es que siempre ejecuta las llamadas a log.trace(), >> independiente de el nivel de log. Por ejemplo, si hago log.setLevel >> ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, >> ERROR y CRITICAL, pero tambien TRACE. >> Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? >> >> Si alguien tiene una pista de porque no respeta el valor 5 y se >> ejecuta siempre, cualquier comentario sera mas que bienvenido. >> >> >> Muchas gracias por adelantado. >> Jose >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > http://ch3m4.org/blog > Buscador Python Hispano: http://ch3m4.org/python-es > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ From pych3m4 en gmail.com Wed Oct 30 11:31:03 2013 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 30 Oct 2013 11:31:03 +0100 Subject: [Python-es] problema al crear un nuevo nivel TRACE en logging. No respeta el nivel de log asignado. In-Reply-To: References: Message-ID: El día 29 de octubre de 2013 16:54, Jose Caballero escribió: > Hola de nuevo, > > acabo de probar tus sugerencias. > > 1. using self.log() en lugar de self._log() parece funcionar bien > > 2. usando la clase MyLogger() funciona, siempre y cuando en el core > de la aplicacion no se llame nunca al logger root, que es el caso > actual. No veo cuál es el problema. El root logger estándar no tiene método 'trace' y ponerle uno te va a dar problemas de uso en multihilo. ¿No sería mejor que quien quiera usar trace lo haga con instancias de tu clase TraceLogger? Igual te sería más práctico usar una "currificación" y dejar el root logger sin tocar: logging.trace = functools.partial(logging.log, logging.TRACE) > > > Muchas gracias por todo, > Jose > > > > El día 28 de octubre de 2013 22:41, Chema Cortes escribió: >> El día 28 de octubre de 2013 21:37, Jose Caballero >> escribió: >>> Hola, >>> >>> >>> quiero agnadir un nivel de log por debajo de DEBUG, llamado TRACE. >>> Siguiendo cierta informacion que encontre en stackoverflow, lo que es >>> implementado es lo siguiente: >>> >>> >>> logging.TRACE = 5 >>> logging.addLevelName(logging.TRACE, 'TRACE') >>> def trace(self, msg, *args, **kwargs): >>> self._log(logging.TRACE, msg, args, **kwargs) >>> logging.Logger.trace = trace >> >> _log envía el mensaje al logger sin chequear los niveles. Usa >> Logger.log en su lugar: >> >> def trace(self, msg, *args, **kwargs): >> self.log(logging.TRACE, msg, *args, **kwargs) >> >> No veo clara la implementación que estás haciendo, con modificaciones >> tanto del módulo logging como de la clase Logger/RootLogger. Sin >> volver a la discursión de estos días sobre especializar o parchear >> clases, deberías derivar tu propia clase de Logger en vez de usar el >> logger root. Parcheando así podrías tener problemas con el >> multiproceso. >> >> import logging >> >> class MyLogger(logging.getLoggerClass()): >> >> TRACE = 5 >> logging.addLevelName(TRACE, "TRACE") >> >> def trace(self, msg, *args, **kwargs): >> self.log(self.TRACE, msg, *args, **kwargs) >> >> logging.setLoggerClass(MyLogger) >> >> logger = logging.getLogger(__name__) >> logger.addHandler(logging.StreamHandler()) >> >> logger.setLevel("TRACE") >> logger.trace("hi") >> >> logger.setLevel("INFO") >> logger.trace("hi") >> >>> >>> >>> y depues de eso ya hago lo normal >>> >>> log = logging.getLogger() >>> .... >>> >>> >>> El unico problema es que siempre ejecuta las llamadas a log.trace(), >>> independiente de el nivel de log. Por ejemplo, si hago log.setLevel >>> ( "INFO" ) responde a todos los mensajes de niveles INFO, WARNING, >>> ERROR y CRITICAL, pero tambien TRACE. >>> Se supone que TRACE solo deberia responder si el nivel es 5 o menos, no? >>> >>> Si alguien tiene una pista de porque no respeta el valor 5 y se >>> ejecuta siempre, cualquier comentario sera mas que bienvenido. >>> >>> >>> Muchas gracias por adelantado. >>> Jose >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> FAQ: http://python-es-faq.wikidot.com/ >> >> >> >> -- >> Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": >> http://ch3m4.org/blog >> Buscador Python Hispano: http://ch3m4.org/python-es >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > FAQ: http://python-es-faq.wikidot.com/ -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es