From perezj en si.uji.es Thu Aug 1 09:03:41 2002 From: perezj en si.uji.es (Jose Alejandro Perez Rubio) Date: 01 Aug 2002 09:03:41 +0200 Subject: [Python-es] expresiones regulares In-Reply-To: <20020731135942.54774.qmail@web20905.mail.yahoo.com> References: <20020731135942.54774.qmail@web20905.mail.yahoo.com> Message-ID: <1028185421.7279.31.camel@pipa.uji.es> On Wed, 2002-07-31 at 15:59, Attila Saorin wrote: > buenas tardes, > > estoy aqui, releyendome por segunda vez la documentacion de las expresiones regulares y, por > ejemplo, no me queda claro como puedo sacar el contenido de algo que le pase entre parentesis. > > un ejemplo de lo que le quiero pasar es: 'linux or (sun and bsd)' No se si he entendido lo que preguntas, pero creo que esto te puede ayudar: import re # los paréntesis no escapados delimitan un grupo # al que luego accederemos mediante groups a = re.compile( ".*\((.*)\).*" ) b = a.match( 'linux or (sun and bsd)') print b.groups()[0] sun and bsd > > entonces, quiero que por un lado, que lo que esta entre parentesis me lo coja por un lado y luego > ya lo tratare yo. por cierto, que pasaria si hay varios parentesis anidados? '(sun and (www or > http))' > la cosa se complica, si lo que está entre paréntesis puede ser otros paréntesis, deberíamos plantearnos si las expresiones regulares son lo más adecuado. Si el problema es tan sencillo como se plantea inicialmente (solo coger lo que se encuentra entre paréntesis) quizá podría servir: a = 'linux or (sun and bsd)' p1 = a.find( '(' ) + 1 p2 = a.rfind( ')' ) if p1 != -1 and p2 != -1 and p1 < p2 : rdo = a[ p1 : p2 ] else rdo = '' print rdo > la funcion split es sencilla, pero provoca que me quiten la expresion que quiero comparar, pero me > sirve para dividir el string, pero son las funciones search y match que no veo ni se como podria > utilizarlas. > > Gracias. > > Attila > From toomany en toomanyhq.homeunix.net Thu Aug 1 10:12:58 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Thu, 1 Aug 2002 10:12:58 +0200 Subject: canal IRC Message-ID: <200208011012.58132.toomany@toomanyhq.homeunix.net> Buenas. Tengo un colega que, como yo, se está interesando cada vez más en Python. Pero dice no encontrar ningún canal de habla hispana sobre python en el IRC. Bueno, concretamente en Hispano. ¿Sabeis si existe alguno, tal vez en openprojects? Gracias. -- Have a nice day ;-) TooManySecrets From mostroratas en yahoo.es Thu Aug 1 11:47:01 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 1 Aug 2002 11:47:01 +0200 (CEST) Subject: [Python-es] expresiones regulares In-Reply-To: <1028185421.7279.31.camel@pipa.uji.es> Message-ID: <20020801094701.45367.qmail@web20904.mail.yahoo.com> --- Jose Alejandro Perez Rubio escribió: > No se si he entendido lo que preguntas, pero creo que esto te puede > ayudar: > > import re > > # los paréntesis no escapados delimitan un grupo > # al que luego accederemos mediante groups > > a = re.compile( ".*\((.*)\).*" ) > b = a.match( 'linux or (sun and bsd)') > > print b.groups()[0] > sun and bsd Gracias, funciona :), pero no entiendo porque al escapar los parentesis los pones dos veces, es decir, al si queremos escapar un parentesis ponemos delante '\' de el, entonces porque pones otro parentesis despues? entiendo que es para que vea el parentesis que queremos emparejar, pero entonces... para que lo escapamos antes? veo que funciona, pero no entiendo por que, con lo que no sabria hacerlo para otro posible caso :( alguno de los metodos del modulo 're' permite recuperar lo que hay antes del parentesis, es decir, de lo que hemos sacado o simplemente lo recupero con un split o miro si has parentesis y cojo lo de antes y despues? > la cosa se complica, si lo que está entre paréntesis puede ser otros > paréntesis, deberíamos plantearnos si las expresiones regulares son lo > más adecuado. Si el problema es tan sencillo como se plantea > inicialmente (solo coger lo que se encuentra entre paréntesis) quizá > podría servir: > > a = 'linux or (sun and bsd)' > > p1 = a.find( '(' ) + 1 > p2 = a.rfind( ')' ) > > if p1 != -1 and p2 != -1 and p1 < p2 : > rdo = a[ p1 : p2 ] > else > rdo = '' > > print rdo tambien me queda claro y es sencillo, el problema de esto es que no veria los casos con dos o mas bloque de parentesis, porque el find busca el primero y el rfind el ultimo, con lo que un ejemplo como: '(sun or linux) and (www and http)' no funciona bien: >>> l2 '(sun or linux) and (http and www)' >>> p1 = l2.find ('(')+1 >>> p2 = l2.rfind(')') >>> if p1 != -1 and p2 != -1 and p1 < p2 : ... rto = l2[ p1 : p2 ] ... else: ... rto = '' ... >>> print rto sun or linux) and (http and www >>> si funcionaria para anidados simples: >>> l3='(sun or (linux and http))' >>> p1 = l3.find ('(')+1 >>> p2 = l3.rfind(')') >>> if p1 != -1 and p2 != -1 and p1 < p2 : ... rto = l3[ p1 : p2 ] ... else: ... rto = '' ... >>> print rto sun or (linux and http) >>> con lo que ya solo quedaria comprobar de nuevo si hay mas parentesis ;) lo pongo por si acaso le sirve a alguien :) Muchas gracias Jose Alejandro. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From jcea en argo.es Thu Aug 1 12:07:40 2002 From: jcea en argo.es (Jesus Cea Avion) Date: Thu, 01 Aug 2002 12:07:40 +0200 Subject: [Python-es] canal IRC References: <200208011012.58132.toomany@toomanyhq.homeunix.net> Message-ID: <3D49086C.DF35DAED@argo.es> > Tengo un colega que, como yo, se está interesando cada vez más en > Python. Pero dice no encontrar ningún canal de habla hispana sobre > python en el IRC. Bueno, concretamente en Hispano. > ¿Sabeis si existe alguno, tal vez en openprojects? Pues yo no conozco ningún canal de python de habla hispana. Pero soy administrador de IRC-Hispano y me gustaría aprobar el registro de algún canal en esta red. Me podeis localizar en IRC-Hispano, con el nick "jcea". -- Jesus Cea Avion _/_/ _/_/_/ _/_/_/ jcea en argo.es http://www.argo.es/~jcea/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/_/_/_/ PGP Key Available at KeyServ _/_/ _/_/ _/_/ _/_/ _/_/ "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ "El amor es poner tu felicidad en la felicidad de otro" - Leibniz From hernan en orgmf.com.ar Thu Aug 1 12:16:11 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 1 Aug 2002 12:16:11 +0200 Subject: [Python-es] expresiones regulares In-Reply-To: <20020801094701.45367.qmail@web20904.mail.yahoo.com> Message-ID: > > No se si he entendido lo que preguntas, pero creo que esto te puede > > ayudar: > > > > import re > > > > # los paréntesis no escapados delimitan un grupo > > # al que luego accederemos mediante groups > > > > a = re.compile( ".*\((.*)\).*" ) > > b = a.match( 'linux or (sun and bsd)') > > > > print b.groups()[0] > > sun and bsd > > Gracias, funciona :), pero no entiendo porque al escapar los > parentesis los pones dos veces, es > decir, al si queremos escapar un parentesis ponemos delante '\' > de el, entonces porque pones otro > parentesis despues? entiendo que es para que vea el parentesis > que queremos emparejar, pero > entonces... para que lo escapamos antes? veo que funciona, pero > no entiendo por que, con lo que no > sabria hacerlo para otro posible caso :( lo hizo así para que obtener los grupos. si lo quieres mas simple puedes usar .search() en vez de .match() >>> a = re.compile("\(.*\)") >>> b = a.search('linux or (sun and bsd)') >>> b.start() 9 >>> b.end() 22 >>> b.group() '(sun and bsd)' >>> como ya te recomendaron antes, si vas a procesar expresiones (que contengan parentesis anidados, etc.) lo mejor es que hagas un parser. no trates de resolverlo con regexp, al principio parece que avanzas pero luego te encontras con montones de situaciones que no puedes resolver, por ejemplo, cuando recibes predicados con errores de sintaxis. > > alguno de los metodos del modulo 're' permite recuperar lo que > hay antes del parentesis, es decir, > de lo que hemos sacado o simplemente lo recupero con un split o > miro si has parentesis y cojo lo > de antes y despues? en ese caso agrega uno o dos grupos mas (antes y despues): "(.*)\((.*)\)(.*)" antes del 1er '(' -----^..^ dentro del 1er '(' ----------^..^ despues del 1er '(' ---------------^..^ > ..... > tambien me queda claro y es sencillo, el problema de esto es que > no veria los casos con dos o mas > bloque de parentesis, porque el find busca el primero y el rfind > el ultimo, con lo que un ejemplo > como: '(sun or linux) and (www and http)' no funciona bien: lo dicho, si vas a procesar expresiones haz un parser. vas a resolver todas las posibilidades y combinaciones de una vez. saludos, -hernan From jcea en argo.es Thu Aug 1 12:23:48 2002 From: jcea en argo.es (Jesus Cea Avion) Date: Thu, 01 Aug 2002 12:23:48 +0200 Subject: canal IRC References: <200208011012.58132.toomany@toomanyhq.homeunix.net> <3D49086C.DF35DAED@argo.es> Message-ID: <3D490C34.25ECE407@argo.es> > Me podeis localizar en IRC-Hispano, con el nick "jcea". Estoy viendo que ya hay un canal #python registrado en IRC-Hispano. Sólo tiene tres usuarios registrados y muy poco movimiento, pero puede ser un punto de encuentro para empezar a organizarnos o "adoptarlo". H configurado mi script para que me meta dentro cuando conecto, así que allí me teneis :-) irc.irc-hispano.org, canal #python :-) -- Jesus Cea Avion _/_/ _/_/_/ _/_/_/ jcea en argo.es http://www.argo.es/~jcea/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/_/_/_/ PGP Key Available at KeyServ _/_/ _/_/ _/_/ _/_/ _/_/ "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ "El amor es poner tu felicidad en la felicidad de otro" - Leibniz From zoso en foton.es Thu Aug 1 12:23:54 2002 From: zoso en foton.es (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Thu, 1 Aug 2002 11:23:54 +0100 Subject: [Python-es] expresiones regulares In-Reply-To: <20020801094701.45367.qmail@web20904.mail.yahoo.com> References: <1028185421.7279.31.camel@pipa.uji.es> <20020801094701.45367.qmail@web20904.mail.yahoo.com> Message-ID: <20020801102354.GB11219@foton.es> On Thu, Aug 01, 2002 at 11:47:01AM +0200, Attila Saorin wrote: > --- Jose Alejandro Perez Rubio escribió: > > No se si he entendido lo que preguntas, pero creo que esto te puede > > ayudar: > > > > import re > > > > # los paréntesis no escapados delimitan un grupo > > # al que luego accederemos mediante groups > > > > a = re.compile( ".*\((.*)\).*" ) > > b = a.match( 'linux or (sun and bsd)') > > > > print b.groups()[0] > > sun and bsd > > Gracias, funciona :), pero no entiendo porque al escapar los parentesis los > pones dos veces, es decir, al si queremos escapar un parentesis ponemos > delante '\' de el, entonces porque pones otro parentesis despues? El otro paréntesis es para que se guarde el contenido, para poder consultarlo después. Es decir, que para cazar dos palabras separadas por "or", en un ejemplo sin paréntesis, como "linux or sun", deberías poner algo como: a = re.compile("(.*) or (.*)") > alguno de los metodos del modulo 're' permite recuperar lo que hay antes del > parentesis, es decir, de lo que hemos sacado o simplemente lo recupero con > un split o miro si has parentesis y cojo lo de antes y despues? Todo lo que quieras sacar seguramente será mejor marcarlo con paréntesis, para poder consultarlo fácilmente después. > [...] > tambien me queda claro y es sencillo, el problema de esto es que no veria > los casos con dos o mas bloque de parentesis, porque el find busca el > primero y el rfind el ultimo, con lo que un ejemplo como: '(sun or linux) > and (www and http)' no funciona bien: Cada vez estoy más convencido de que lo que necesitas es un analizador completo. Será muy simple, pero desde luego mucho más claro que estar escribiendo un montón de insultos de cómic para intentar cubrir todos los casos :-) -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow PD: Con «insultos de cómic» me refiero a los caracteres raros de las expresiones regulares, claro. From toomany en toomanyhq.homeunix.net Thu Aug 1 13:43:03 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Thu, 1 Aug 2002 13:43:03 +0200 Subject: [Python-es] canal IRC In-Reply-To: <3D490C34.25ECE407@argo.es> References: <200208011012.58132.toomany@toomanyhq.homeunix.net> <3D49086C.DF35DAED@argo.es> <3D490C34.25ECE407@argo.es> Message-ID: <200208011343.03250.toomany@toomanyhq.homeunix.net> On Thursday 01 August 2002 12:23, Jesus Cea Avion wrote: > > Me podeis localizar en IRC-Hispano, con el nick "jcea". > > Estoy viendo que ya hay un canal #python registrado en IRC-Hispano. Sólo > tiene tres usuarios registrados y muy poco movimiento, pero puede ser un > punto de encuentro para empezar a organizarnos o "adoptarlo". > > H configurado mi script para que me meta dentro cuando conecto, así que > allí me teneis :-) > > irc.irc-hispano.org, canal #python :-) Es estupendo!! Pero quiero hacer una propuesta: ¿por qué no creamos un canal en openprojects? Personalmente lo prefiero mil veces antes que Hispano. Estos últimos, desgraciadamente, han perdido demasiado ya últimamente... -- Have a nice day ;-) TooManySecrets From mostroratas en yahoo.es Thu Aug 1 16:08:38 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 1 Aug 2002 16:08:38 +0200 (CEST) Subject: [Python-es] expresiones regulares In-Reply-To: <20020801102354.GB11219@foton.es> Message-ID: <20020801140838.34709.qmail@web20909.mail.yahoo.com> --- Esteban Manchado Velázquez escribió: > Cada vez estoy más convencido de que lo que necesitas es un analizador > completo. Será muy simple, pero desde luego mucho más claro que estar > escribiendo un montón de insultos de cómic para intentar cubrir todos los > casos :-) > PD: Con «insultos de cómic» me refiero a los caracteres raros de las > expresiones regulares, claro. Ya me lo imaginaba. Pues nada, ya me ha quedado claro del todo, gracias a todos por "expresar regularmente" ;) vuestros conocimientos y asi hacer que vea la luz sobre el tema este de las expreg en python :) Bueno, vere que opina mi profe de como prefiere que lo haga y a ello me pondre. Sera casi como volver a hacer la practica de compiladores de la carrera :( Gracias. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From peralta en aditel.org Thu Aug 1 16:22:51 2002 From: peralta en aditel.org (Luis Peralta) Date: Thu, 1 Aug 2002 16:22:51 +0200 Subject: [Python-es] canal IRC In-Reply-To: <200208011343.03250.toomany@toomanyhq.homeunix.net> References: <200208011012.58132.toomany@toomanyhq.homeunix.net> <3D49086C.DF35DAED@argo.es> <3D490C34.25ECE407@argo.es> <200208011343.03250.toomany@toomanyhq.homeunix.net> Message-ID: <20020801142251.GA12220@spisa.act.uji.es> On Thu Aug 01, 2002 at 01:43:03PM +0200, TooManySecrets wrote: > > Pero quiero hacer una propuesta: ¿por qué no creamos un canal en openprojects? > Personalmente lo prefiero mil veces antes que Hispano. Estos últimos, > desgraciadamente, han perdido demasiado ya últimamente... Yo creo que encajaría más en OPN que en Hispano. La razón: Aditel tiene el único server de OPN en España ;) Pero no creo que yo sea el más adecuado para sugerir, dado mi karma pythoniano negativo. -- luis peralta / jaxp =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= CS Student | peralta at aditel dot org | http://www.aditel.org/~peralta/ From toomany en toomanyhq.homeunix.net Thu Aug 1 17:13:54 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Thu, 1 Aug 2002 17:13:54 +0200 Subject: [Python-es] canal IRC In-Reply-To: <20020801142251.GA12220@spisa.act.uji.es> References: <200208011012.58132.toomany@toomanyhq.homeunix.net> <200208011343.03250.toomany@toomanyhq.homeunix.net> <20020801142251.GA12220@spisa.act.uji.es> Message-ID: <200208011713.54230.toomany@toomanyhq.homeunix.net> On Thursday 01 August 2002 16:22, Luis Peralta wrote: > Yo creo que encajaría más en OPN que en Hispano. La razón: Aditel tiene > el único server de OPN en España ;) Pero no creo que yo sea el más > adecuado para sugerir, dado mi karma pythoniano negativo. mmmm... ¿OPN == openproject? u ¿OPN =! openproject? En cualquier caso, si no hay ningún tipo de problemas, ¡¡adelante!! XD Y recuerda, la botella siempre está medio llena... ;-) -- Have a nice day ;-) TooManySecrets From zoso en demiurgo.org Thu Aug 1 18:42:19 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Thu, 1 Aug 2002 17:42:19 +0100 Subject: [Python-es] expresiones regulares In-Reply-To: <20020801140838.34709.qmail@web20909.mail.yahoo.com> References: <20020801102354.GB11219@foton.es> <20020801140838.34709.qmail@web20909.mail.yahoo.com> Message-ID: <20020801164219.GE684@demiurgo.org> On Thu, Aug 01, 2002 at 04:08:38PM +0200, Attila Saorin wrote: > [...] > Bueno, vere que opina mi profe de como prefiere que lo haga y a ello me > pondre. Sera casi como volver a hacer la practica de compiladores de la > carrera :( Si ya sabes de gramáticas va a ser trivial implementar el analizador para esas expresiones. Ten en cuenta que necesitarías, probablemente, cinco terminales («and», «or», «paréntesis abierto», «paréntesis cerrado», «literal») y una gramática *muy* simplona para resolver eso. Luego pones los trocitos de Python donde haga falta para manejar los casos y listo. ¡Ánimo! :-) -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From mostroratas en yahoo.es Thu Aug 1 18:59:43 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 1 Aug 2002 18:59:43 +0200 (CEST) Subject: [Python-es] diferencia de ejecucion ??? Message-ID: <20020801165943.84385.qmail@web20903.mail.yahoo.com> hola, ya estoy aqui de nuevo :( ahora por algo que no me explico, si ejecuto este codigo de uno de mis modulos desde el emacs o llamandole desde el interprete (senialo la linea que me interesa): if self.args['datepreserve']=='yes' or 1: # preserve the date print 'deberia guardar la fecha del fichero' -------->>>>> shutil.copy2(self.args['src'], self.args['dst']) me copia el fichero, pero sin guardarme la fecha del original, en cambio, si ejecuto desde el interprete o tb desde emacs solo: >>> shutil.copy2('/home/attila/python/texto.txt', '/home/attila/toto.txt') se copia el fichero y me guarda la fecha del fichero texto.txt. alguien me puede explicar porque puede pasar esto? es el mismo comando para ambos casos y da igual el nombre del fichero, lo unico que deberia influir es si llamo a 'copy' o a 'copy2' y como podeis ver, en ambos casos llamo a 'copy2' que es el que me mantiene la fecha del archivo original. No lo entiendo :( porque no se que otras cosas podian influir en esta llamada. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From jcea en argo.es Thu Aug 1 20:03:32 2002 From: jcea en argo.es (Jesus Cea Avion) Date: Thu, 01 Aug 2002 20:03:32 +0200 Subject: [Python-es] canal IRC References: <200208011012.58132.toomany@toomanyhq.homeunix.net> References: <200208011012.58132.toomany@toomanyhq.homeunix.net> <3D49086C.DF35DAED@argo.es> <3D490C34.25ECE407@argo.es> <200208011343.03250.toomany@toomanyhq.homeunix.net> Message-ID: <3D4977F4.F5BBAB02@argo.es> > ¿por qué no creamos un canal en openprojects? > Personalmente lo prefiero mil veces antes que Hispano. Estos últimos, > desgraciadamente, han perdido demasiado ya últimamente... A mí me da lo mismo. Yo soy administrador de IRC-Hispano y uno de sus principales desarrolladores, y estoy conectado como 14 horas al día. Si quereis otra red, yo no pongo pelas. Pero me pasaría mucho menos por allí, ya que mi tiempo es finito... :-) -- Jesus Cea Avion _/_/ _/_/_/ _/_/_/ jcea en argo.es http://www.argo.es/~jcea/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/_/_/_/ PGP Key Available at KeyServ _/_/ _/_/ _/_/ _/_/ _/_/ "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ "El amor es poner tu felicidad en la felicidad de otro" - Leibniz From neo_cool en cantv.net Thu Aug 1 22:02:47 2002 From: neo_cool en cantv.net (neo_cool en cantv.net) Date: Thu, 1 Aug 2002 16:02:47 -0400 Subject: [Python-es] canal IRC Message-ID: <188670-2200284120247182@cantv.net> En #python de irc hispano nos encontramos alguna gente interesadas en el lenguaje... el canal por lo general no se la pasa repleto pero si gente empieza a entrar seguro poco a poco podra ser un canal consistente como lo son otros de linux... delphi.. etc etc Buenas. Tengo un colega que, como yo, se está interesando cada vez más en Python. Pero dice no encontrar ningún canal de habla hispana sobre python en el IRC. Bueno, concretamente en Hispano. ¿Sabeis si existe alguno, tal vez en openprojects? Gracias. -- Have a nice day ;-) TooManySecrets From hernan en orgmf.com.ar Thu Aug 1 22:15:32 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 1 Aug 2002 22:15:32 +0200 Subject: expresiones regulares In-Reply-To: <20020801140838.34709.qmail@web20909.mail.yahoo.com> References: <20020801140838.34709.qmail@web20909.mail.yahoo.com> Message-ID: > Pues nada, ya me ha quedado claro del todo, gracias a todos por > "expresar regularmente" ;) > vuestros conocimientos y asi hacer que vea la luz sobre el tema > este de las expreg en python :) > > Bueno, vere que opina mi profe de como prefiere que lo haga y a > ello me pondre. Sera casi como > volver a hacer la practica de compiladores de la carrera :( que pena! ya me habia entusiasmado y trate de resolverlo sin usar parsers... demas esta decir que yo tambien opino que la mejor solucion es con analizadores. solo que me interesaba ver si es posible hacer algo no tan "bien hecho" :-) que se pudiera resolver en muy poquitas lineas de codigo. el tipo de predicados que aceptaria el programa difiere solo un poco de la sintaxis de python. ej: linux and ( vms or http and www) el problema es que python no puede evaluar las palabras sueltas correctamente. además hace falta el objeto sobre el cual se aplicaría el predicado. si hacemos que dicho objeto fuera de clase X y que tuviera un metodo que evalue la condicion de verdad de una caracteristica dada: >>> class X: def es_un(self, st): if st == "linux": return True return False >>> xx = X() >>> xx.es_un("linux") 1 >>> xx.es_un("www") 0 >>> y si pudieramos transformar el predicado p = "sun or ( linux and http)" por una expresion valida en python como: e = "xx.es_un('sun') or ( xx.es_un('linux') and xx.es_un('http'))" bastaria evaluar en python la expresion para obtengamos el resultado deseado: >>> eval(e, {'xx': xx}) 0 >>> la funcion de transformacion lo que tendría que hacer cambiar cada literal por xx.es_un('el_literal') exceptuando 'and' 'or' y 'not'. def pred2expr(predicado): import re r1 = re.compile(r"(\w+)") r2 = re.compile(r"xx.es_un\('(and|not|or)'\)") return r2.sub(r"\1", r1.sub(r"xx.es_un('\1')", predicado)) lo que hace esta funcion es buscar todas las palabras (regexp r1: \w+ ) y reemplazarlas por xx.es_un(...) esto incluye a and, not y or por lo que la segunda expresion regular r2 busca los casos xx.es_un('and') etc. y los devuelve al original. lo bueno es que el propio python se encarga de chequear la sintaxis. >>> e = pred2expr("pirulo (") # <-- notar el ( demas >>> eval(e, {'xx':xx}) Traceback (most recent call last): File "", line 1, in ? eval(e, {'xx':xx}) File "", line 1 xx.es_un('pirulo') ( ^ SyntaxError: unexpected EOF while parsing >>> saludos, -Hernan From perezj en si.uji.es Fri Aug 2 10:32:59 2002 From: perezj en si.uji.es (Jose Alejandro Perez Rubio) Date: 02 Aug 2002 10:32:59 +0200 Subject: expresiones regulares In-Reply-To: References: Message-ID: <1028277179.7446.116.camel@pipa.uji.es> On Thu, 2002-08-01 at 22:15, Hernan Martinez Foffani wrote: > > Pues nada, ya me ha quedado claro del todo, gracias a todos por > > "expresar regularmente" ;) > > vuestros conocimientos y asi hacer que vea la luz sobre el tema > > este de las expreg en python :) > > > > Bueno, vere que opina mi profe de como prefiere que lo haga y a > > ello me pondre. Sera casi como > > volver a hacer la practica de compiladores de la carrera :( > > que pena! ya me habia entusiasmado y trate de resolverlo sin > usar parsers... > demas esta decir que yo tambien opino que la mejor solucion > es con analizadores. solo que me interesaba ver si es posible > hacer algo no tan "bien hecho" :-) que se pudiera resolver > en muy poquitas lineas de codigo. > > el tipo de predicados que aceptaria el programa difiere solo > un poco de la sintaxis de python. ej: > linux and ( vms or http and www) > > el problema es que python no puede evaluar las palabras sueltas > correctamente. además hace falta el objeto sobre el cual se > aplicaría el predicado. > > si hacemos que dicho objeto fuera de clase X y que tuviera un > metodo que evalue la condicion de verdad de una caracteristica > dada: > > >>> class X: > def es_un(self, st): > if st == "linux": > return True > return False > > > >>> xx = X() > >>> xx.es_un("linux") > 1 > >>> xx.es_un("www") > 0 > >>> > > y si pudieramos transformar el predicado > p = "sun or ( linux and http)" > por una expresion valida en python como: > e = "xx.es_un('sun') or ( xx.es_un('linux') and xx.es_un('http'))" > > bastaria evaluar en python la expresion para obtengamos el > resultado deseado: > > >>> eval(e, {'xx': xx}) > 0 > >>> > > la funcion de transformacion lo que tendría que hacer > cambiar cada literal por xx.es_un('el_literal') > exceptuando 'and' 'or' y 'not'. > > def pred2expr(predicado): > import re > r1 = re.compile(r"(\w+)") > r2 = re.compile(r"xx.es_un\('(and|not|or)'\)") > return r2.sub(r"\1", > r1.sub(r"xx.es_un('\1')", > predicado)) > > lo que hace esta funcion es buscar todas las palabras > (regexp r1: \w+ ) y reemplazarlas por xx.es_un(...) > esto incluye a and, not y or por lo que la segunda > expresion regular r2 busca los casos xx.es_un('and') > etc. y los devuelve al original. > > > lo bueno es que el propio python se encarga de chequear > la sintaxis. > > >>> e = pred2expr("pirulo (") # <-- notar el ( demas > >>> eval(e, {'xx':xx}) > Traceback (most recent call last): > File "", line 1, in ? > eval(e, {'xx':xx}) > File "", line 1 > xx.es_un('pirulo') ( > ^ > SyntaxError: unexpected EOF while parsing > >>> > Jo! Que imaginación, te felicito, la idea es genial. Creo que esto hace lo que queremos: import re def xx( reobj ): k = reobj.group() if k in [ 'and', 'or', 'not' ] : rdo = k else : if k == 'linux' : rdo = '1' else : rdo = '0' return rdo p = "sun or ( linux and http)" print eval( re.sub( '\w+', xx, p ) ) Un saludo From hernan en orgmf.com.ar Fri Aug 2 09:53:51 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 2 Aug 2002 09:53:51 +0200 Subject: expresiones regulares In-Reply-To: <1028277179.7446.116.camel@pipa.uji.es> References: <1028277179.7446.116.camel@pipa.uji.es> Message-ID: > Jo! Que imaginación, te felicito, la idea es genial... 'cha gracia! > Creo que esto hace lo que queremos: > > import re > > def xx( reobj ): > > k = reobj.group() > > if k in [ 'and', 'or', 'not' ] : > rdo = k > else : > if k == 'linux' : > rdo = '1' > else : > rdo = '0' > > return rdo > > p = "sun or ( linux and http)" > print eval( re.sub( '\w+', xx, p ) ) ah... el 2do argumento de sub como funcion... esa no la tenia. todos los dias se aprende algo. me gusto esta solucion, es muy elegante. -Hernan From mostroratas en yahoo.es Fri Aug 2 10:17:47 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Fri, 2 Aug 2002 10:17:47 +0200 (CEST) Subject: expresiones regulares In-Reply-To: References: Message-ID: <20020802081747.20941.qmail@web20910.mail.yahoo.com> --- Hernan Martinez Foffani escribió: > que pena! ya me habia entusiasmado y trate de resolverlo sin > usar parsers... No, hombre, no!!! no vaya yo a quitarte la ilusion ;) que mejor deporte que darle al coco para encontrar una solucion a un problema, mucho mejor que casi todas las grandes aficiones actuales :( yo al menos, la satisfaccion de resolver las practicas y demas programas era cojonuda :) Vuestras ideas me sirven para llegar y decirle, hay estas posibilidades, yo creo que es mejor esta y por que, quizas se lleve una alegria ;D Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From mostroratas en yahoo.es Fri Aug 2 17:17:20 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Fri, 2 Aug 2002 17:17:20 +0200 (CEST) Subject: [Python-es] expresiones regulares y mi profe al final dice... In-Reply-To: <1028277179.7446.116.camel@pipa.uji.es> Message-ID: <20020802151720.79356.qmail@web20910.mail.yahoo.com> --- Jose Alejandro Perez Rubio escribió: > > > Bueno, vere que opina mi profe de como prefiere que lo haga y a > > > ello me pondre. Sera casi como > > > volver a hacer la practica de compiladores de la carrera :( > > > > que pena! ya me habia entusiasmado y trate de resolverlo sin > > usar parsers... > > demas esta decir que yo tambien opino que la mejor solucion > > es con analizadores. solo que me interesaba ver si es posible > > hacer algo no tan "bien hecho" :-) que se pudiera resolver > > en muy poquitas lineas de codigo. Bueno, ya he hablado con mi profesor, le he contado lo que tenia y le he preguntado como lo queria y me ha dicho que quiere un parser, es decir, pasar de: 'linux|(sun&(!pc))' o lo mismo 'linux or (sun and (not pc))' a algo como: Or(Term('linux'), And(Term('sun'), Not(Term('pc')))) primero empezare trabajando en esto y luego hare el parser que me pase de uno al otro. es decir, como hacer un arbol: |(or) / \ / \ linux &(and) / \ / \ sun !(not) | pc Con lo que debo definir las 4 clases posibles, Or, And, Not y Terminal donde cada una se encargara de evaluar lo que le pasan y me devolvera si se evalua o no con respecto a las clases o predicados que nosotros definimos antes (es decir, si exite 'sun', 'www' y demas). Pues nada, solo es para que supierais en que han acabado los mails de estos dias, espero que no te haya decepcionado mucho Hernan ;) Gracias de nuevo y... si, muy elegante y facil Jose :) Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From hernan en orgmf.com.ar Fri Aug 2 17:38:17 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 2 Aug 2002 17:38:17 +0200 Subject: [Python-es] expresiones regulares y mi profe al final dice... In-Reply-To: <20020802151720.79356.qmail@web20910.mail.yahoo.com> Message-ID: > Bueno, ya he hablado con mi profesor, le he contado lo que tenia > y le he preguntado como lo queria > y me ha dicho que quiere un parser, es decir, pasar de: si. era de esperarse que fuera eso lo que quería que hicieras ;-) > 'linux|(sun&(!pc))' o lo mismo 'linux or (sun and (not pc))' > > a algo como: Or(Term('linux'), And(Term('sun'), Not(Term('pc')))) preguntale si podés usar alguna biblioteca o extension para parsers, de esas que te permiten definir la gramatica o si también tenés que hacer eso a mano. > Pues nada, solo es para que supierais en que han acabado los > mails de estos dias, espero que no te > haya decepcionado mucho Hernan ;) no... ¿por qué? valio la pena. > Gracias de nuevo y... si, muy elegante y facil Jose :) ... y yo aprendi algo. saludos, -Hernan From mostroratas en yahoo.es Fri Aug 2 18:04:25 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Fri, 2 Aug 2002 18:04:25 +0200 (CEST) Subject: expresiones regulares y mi profe al final dice... In-Reply-To: References: Message-ID: <20020802160425.88533.qmail@web20910.mail.yahoo.com> --- Hernan Martinez Foffani > preguntale si podés usar alguna biblioteca o extension para > parsers, de esas que te permiten definir la gramatica o si > también tenés que hacer eso a mano. la hay en python? he mirado por encima, como ya he dicho, me he puesto con lo otro, pero he visto parsers para XML, http y algo mas, pero no he visto nada a lo que echarle un vistazo, o te refieres a el 'parser -- Access Python parse trees'?. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From hernan en orgmf.com.ar Fri Aug 2 18:38:28 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 2 Aug 2002 18:38:28 +0200 Subject: [Python-es] expresiones regulares y mi profe al final dice... In-Reply-To: <20020802160425.88533.qmail@web20910.mail.yahoo.com> Message-ID: > > preguntale si podés usar alguna biblioteca o extension para > > parsers, de esas que te permiten definir la gramatica o si > > también tenés que hacer eso a mano. > > la hay en python? he mirado por encima, como ya he dicho, me he > puesto con lo otro, pero he visto > parsers para XML, http y algo mas, pero no he visto nada a lo que > echarle un vistazo, o te > refieres a el 'parser -- Access Python parse trees'?. no "vienen" con python. son bibliotecas de terceras partes. se mencionaron algunas en un mail anterior en este mismo hilo de conversacion. si... fue en un mensaje de Esteban del que me tomo la libertad de transcribir: ------------- ...herramienta que te automatice el trabajo sucio. Mirando un poquito en Google encontré una que parece que te vendrá bien. Se llama Yapps, y está en http://theory.stanford.edu/~amitp/Yapps/ También está PLY, que parece más completo (y tiene enlaces a otros proyectos): http://systems.cs.uchicago.edu/ply/ Por último, parece que el peso pesado de los meta-compiladores de Python es SPARK, que es el que usa el Parrot (!): http://pages.cpsc.ucalgary.ca/~aycock/spark/ http://gnosis.cx/publish/programming/charming_python_b6.html En la página oficial de Python tienes un apartado sobre esto: http://www.python.org/sigs/parser-sig/ Seguro que alguno te sirve (probablemente el primero, Yapps). ----------------- Saludos, -Hernan From zoso en foton.es Tue Aug 6 15:55:11 2002 From: zoso en foton.es (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Tue, 6 Aug 2002 14:55:11 +0100 Subject: =?iso-8859-1?Q?=BFCierres?= en Python? Message-ID: <20020806135511.GC2114@foton.es> Hola a todos. Estoy haciendo experimentos con Jabber (al final preferí Jabber a XML-RPC por algunas razones), pero tengo un problemilla que sospecho que más bien se debe a mi ignorancia sobre Python, más que sobre Jabber y cía. He buscado un poquito por la red pero no he encontrado la respuesta a mis plegarias, así que pregunto por aquí, a ver si a alguien se le ocurre una solución. La situación es la siguiente: Tengo una clase que internamente crea un objeto de conexión Jabber. Los detalles no importan, excepto que hay un método para establecer llamadas a funciones definidas por el usuario, bajo ciertas circunstancias (cuando se recibe un mensaje nuevo, por ejemplo). La función que me interesa tiene que recibir dos parámetros, pero yo quiero que esa función sea un método del objeto actual. Esto es un problema, si entiendo bien Python, por el parámetro implícito «self» (necesitaría declarar tres parámetros, y la llamada falla). La solución que se me había ocurrido era crear una función lambda o algo similar, que contuviera implícitamente una referencia al objeto actual (esta función lambda se crearía en el constructor del objeto)... pero parece, según dicen en la Red, que Python no tiene «closures» o cierres. Es decir, que lo que se me había ocurrido era algo como: ------------------------- 8< ------------------------- class Clase: def __init__(self): # ... self.f = lambda con, msg: self.nuevoMensaje(con, msg) self.jabber.setMessageHandler(self.f) def nuevoMensaje(self, con, msg): print "He recibido un nuevo mensaje con el texto %s" % msg ------------------------- >8 ------------------------- Pero no funciona, porque en la función lambda (o sea, f) no se recuerda el valor que tenía «self» EN LA CREACIÓN DE LA FUNCIÓN, sino que se intenta referenciar a un tal «self» que exista (o no, que es el caso) en el contexto en que se la llame. Todo esto es bastante abstracto, así que no sé si se entiende. Si quieren más aclaraciones, ya saben (tengo muchas ganas de resolver esto). Igual es un problema de concepción general y habría que hacerlo de una manera completamente diferente. Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From zoso en demiurgo.org Wed Aug 7 13:11:10 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Wed, 7 Aug 2002 12:11:10 +0100 Subject: [Python-es] =?iso-8859-1?Q?=BFCierres?= en Python? Message-ID: <20020807111109.GA1292@foton.es> Hola a todos. Estoy haciendo experimentos con Jabber (al final preferí Jabber a XML-RPC por algunas razones), pero tengo un problemilla que sospecho que más bien se debe a mi ignorancia sobre Python (uso la versión 2.1), más que sobre Jabber y cía. He buscado un poquito por la red pero no he encontrado la respuesta a mis plegarias, así que pregunto por aquí, a ver si a alguien se le ocurre una solución. La situación es la siguiente: Tengo una clase que internamente crea un objeto de conexión Jabber. Los detalles no importan, excepto que hay un método para establecer llamadas a funciones definidas por el usuario, bajo ciertas circunstancias (cuando se recibe un mensaje nuevo, por ejemplo). La función que me interesa tiene que recibir dos parámetros, pero yo quiero que esa función sea un método del objeto actual. Esto es un problema, si entiendo bien Python, por el parámetro implícito «self» (necesitaría declarar tres parámetros, y la llamada falla). La solución que se me había ocurrido era crear una función lambda o algo similar, que contuviera implícitamente una referencia al objeto actual (esta función lambda se crearía en el constructor del objeto)... pero parece, según dicen en la Red, que Python no tiene «closures» o cierres. Es decir, que lo que se me había ocurrido era algo como: ------------------------- 8< ------------------------- class Clase: def __init__(self): # ... self.f = lambda con, msg: self.nuevoMensaje(con, msg) self.jabber.setMessageHandler(self.f) def nuevoMensaje(self, con, msg): print "He recibido un nuevo mensaje con el texto %s" % msg ------------------------- >8 ------------------------- Pero no funciona, porque en la función lambda (o sea, f) no se recuerda el valor que tenía «self» EN LA CREACIÓN DE LA FUNCIÓN, sino que se intenta referenciar a un tal «self» que exista (o no, que es el caso) en el contexto en que se la llame. Todo esto es bastante abstracto, así que no sé si se entiende. Si quieren más aclaraciones, ya saben (tengo muchas ganas de resolver esto). Igual es un problema de concepción general y habría que hacerlo de una manera completamente diferente. Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From hernan en orgmf.com.ar Wed Aug 7 14:47:53 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Wed, 7 Aug 2002 14:47:53 +0200 Subject: [Python-es] =?iso-8859-1?Q?RE:_=5BPython-es=5D_=BFCierres_en_Python=3F?= In-Reply-To: <20020806135511.GC2114@foton.es> Message-ID: si quien dispara el handler (supongo que algun metodo de jabber) tiene a mano el objeto self de Clase, bastaría con que registres en el handler el "unbound method" Clase.nuevoMensaje pero sospecho que no vas a tener referencia al objeto self, no? ¿tiene que ser nuevoMensaje() un metodo de la clase? ¿cual es la interfaz de jabber.setMessageHandler()? si no es un metodo de Clase, pasarle eso solo te traerá problemas. hay una forma algo extraña de simular closures. es sucia y limitada (no sirve si tenes que registrar mas de un handler) ejemplo (no probado): class Clase: def __init__(self): # ... self.jabber.setMessageHandler(self) def __call__(self, con, msg): self.nuevoMensaje(con, msg) def nuevoMensaje(self, con, msg): print "He recibido un nuevo mensaje con el texto %s" % msg saludos, -Hernan From debianerolinux en yahoo.com Wed Aug 7 15:28:31 2002 From: debianerolinux en yahoo.com (debianero debian) Date: Wed, 7 Aug 2002 06:28:31 -0700 (PDT) Subject: _[Python-es]_¿Cierres_en_Python? In-Reply-To: References: Message-ID: <20020807132831.26481.qmail@web14410.mail.yahoo.com> --- Hernan Martinez Foffani wrote: > si quien dispara el handler (supongo que algun > metodo de jabber) > tiene a mano el objeto self de Clase, bastaría con > que registres > en el handler el "unbound method" Clase.nuevoMensaje > pero sospecho que no vas a tener referencia al > objeto self, no? > > ¿tiene que ser nuevoMensaje() un metodo de la clase? > ¿cual es la interfaz de jabber.setMessageHandler()? > si no es un metodo de Clase, pasarle eso solo te > traerá problemas. > > > hay una forma algo extraña de simular closures. es > sucia y > limitada (no sirve si tenes que registrar mas de un > handler) > ejemplo (no probado): > > class Clase: > def __init__(self): > # ... > self.jabber.setMessageHandler(self) > > def __call__(self, con, msg): > self.nuevoMensaje(con, msg) > > def nuevoMensaje(self, con, msg): > print "He recibido un nuevo mensaje con el > texto %s" % msg > > saludos, > -Hernan > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es __________________________________________________ Do You Yahoo!? Yahoo! Health - Feel better, live better http://health.yahoo.com From zoso en demiurgo.org Wed Aug 7 15:42:15 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Wed, 7 Aug 2002 14:42:15 +0100 Subject: [Python-es] RE: =?iso-8859-1?Q?=5BPyth?= =?iso-8859-1?Q?on-es=5D_=BFCierres?= en Python? In-Reply-To: References: <20020806135511.GC2114@foton.es> Message-ID: <20020807134215.GH1292@foton.es> Siento la duplicación del mensaje original, es que envié el correo desde otra dirección y como no me llegaba el aviso de que el administrador lo estaba mirando, decidí enviarlo de nuevo, pero con la dirección «de verdad». On Wed, Aug 07, 2002 at 02:47:53PM +0200, Hernan Martinez Foffani wrote: > si quien dispara el handler (supongo que algun metodo de jabber) > tiene a mano el objeto self de Clase, bastaría con que registres > en el handler el "unbound method" Clase.nuevoMensaje > pero sospecho que no vas a tener referencia al objeto self, no? Exacto. Ése es precisamente el problema. > ¿tiene que ser nuevoMensaje() un metodo de la clase? No necesariamente, pero tiene que tener alguna forma de saber cuál es el objeto que registró la función de recepción de mensaje. La única solución que se me ocurre para que una función tenga «consciencia» de un valor es que esa función sea un método.... o usar un cierre. > ¿cual es la interfaz de jabber.setMessageHandler()? La definición completa es ------------------------- 8< ------------------------- def setMessageHandler(self, func, type='default'): """Sets a the callback func for recieving messages Mulitple callback functions can be set which are called in succession. A type attribute can also be optionally passed so the callback is only called when a message of this type is recieved. """ self.msg_hdlrs.append({ type : func }) ------------------------- >8 ------------------------- > si no es un metodo de Clase, pasarle eso solo te traerá problemas. > > > hay una forma algo extraña de simular closures. es sucia y > limitada (no sirve si tenes que registrar mas de un handler) > ejemplo (no probado): > > class Clase: > def __init__(self): > # ... > self.jabber.setMessageHandler(self) > > def __call__(self, con, msg): > self.nuevoMensaje(con, msg) > > def nuevoMensaje(self, con, msg): > print "He recibido un nuevo mensaje con el texto %s" % msg Algo parecido se me había ocurrido, pero me hice un lío y no di con la solución. Probando algo similar a lo que propones, da otro error en la llamada, porque al objeto le falta el atributo «func_code». Supongo que debe ser algo interno de las funciones. El caso es que mirando el paquete jabber.py he visto que el método que hace las llamadas a las funciones registradas con setMessageHandler está «preparada» para sobrecargarse. Me parece una forma un poco cutre de hacerlo (habría preferido que la función fuera más genérica y me ahorrara tener que sacar una clase derivada sólo para cambiar la forma de llamada y almacenar un valor que necesito), pero qué se le va a hacer :-) Gracias, Hernán, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow PD: Por cierto, ¿no se supone que añadieron cierres a Python 2.2? Yo uso 2.1, es sólo por curiosidad. From kmilo en softhome.net Mon Aug 5 06:34:45 2002 From: kmilo en softhome.net (kmilo) Date: Sun, 4 Aug 2002 23:34:45 -0500 Subject: [Python-es] Ju is ju In-Reply-To: <1e7631c289.1c2891e763@page.melange.net> References: <1e7631c289.1c2891e763@page.melange.net> Message-ID: <20020804233445.2508238c.kmilo@softhome.net> Yo estoy aprendiendo diferentes temas de la programacion como: *POO *GUI *CGI *D.B. *XML a medida que algo me gusta y veo la necesidad de un determinada aplicacion(sencilla) entonces me pongo manos a la obra. La ventaja de estar aprendiendo con python es que me centro mas en la teoria ya que generalmente la implementacion es bastante sencilla, con lo cual en caso de que me vea obligado en algun momento a cambiar de lenguaje esto se hace sumamente facil pues ya conozco las metodologias, y solo debo preocuparme por el lenguaje en si. (no conozco ninguna universidad en colombia donde se enseñe Python) Ahora tengo como ganas de mirar zope, pero debido a que acabo de entrar de vacaciones creo que esto se demorara un poco PDT: Mas vale tarde que nunca On Tue, 04 Jun 2002 09:02:58 GMT rapto wrote: > Sería interesante es hacer un directorio de lo que está haciendo cada > uno de nosostros en Python. En plan informal, valdría con responder a > este mensaje a la lista. > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es -- http://atenea.udistrital.edu.co/formulario.html Dado el tamaño de nuestra comunidad, con sólo pedir, podemos hacer la diferencia. http://www.gnu.org/philosophy/no-word-attachments.es.htm Orgulloso Estudiante de 1 semestre de Ingenieria de Sistemas Universidad Distrital Francisco Jose de Caldas Bogota Colombia Linux user number 269263 Homepage: http://kmiloweb.netfirms.com/ From hernan en orgmf.com.ar Wed Aug 7 16:39:57 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Wed, 7 Aug 2002 16:39:57 +0200 Subject: [Python-es] =?iso-8859-1?Q?RE:_=5BPython-es=5D_RE:_=5BPython-es=5D_=BFCierres_en_Py?= =?iso-8859-1?Q?thon=3F?= In-Reply-To: <20020807134215.GH1292@foton.es> Message-ID: > > ¿tiene que ser nuevoMensaje() un metodo de la clase? > > No necesariamente, pero tiene que tener alguna forma de saber > cuál es el objeto que registró la función de recepción de mensaje. > La única solución que se me ocurre para que una función tenga > «consciencia» de un valor es que esa función sea un método.... > o usar un cierre. el problema de pasarle un metodo es que perdes la referencia al objeto porque precisamente estas pasando el metodo y no el objeto. pero esto ya lo sabes :-) python no tiene cierres. quizás te sirva atributos de funciones: def f(msg): print ">", msg, f.objeto f.objeto = [1,2,3] > > ¿cual es la interfaz de jabber.setMessageHandler()? > > La definición completa es > > ------------------------- 8< ------------------------- > def setMessageHandler(self, func, type='default'): > """Sets a the callback func for recieving messages > Mulitple callback functions can be set which are > called in succession. A type attribute can also be > optionally passed so the callback is only called when a > message of this type is recieved. > """ en ningun lado te dice de los 2 parametros (con y msg). supongo que lo habrás sacado del codigo u otro lado. > Algo parecido se me había ocurrido, pero me hice un lío y no di con la > solución. Probando algo similar a lo que propones, da otro error en la > llamada, porque al objeto le falta el atributo «func_code». > Supongo que debe ser algo interno de las funciones. mmm... podría ser que la implementación está chequeando que sea una funcion real, y no un callable. si el callback fuera invocado con apply(objeto_callback, [parametro_con, parametro_msg]) no tendrías mayores problemas. sospecho que está chequeando de mas. > PD: Por cierto, ¿no se supone que añadieron cierres a Python > 2.2? Yo uso 2.1, es sólo por curiosidad. lo que se agregaron fueron los "nested scopes". que es una condicion necesaria (pero no suficiente) para tener cierres en python. -Hernan From amarzal en lsi.uji.es Wed Aug 7 18:40:09 2002 From: amarzal en lsi.uji.es (=?iso-8859-15?B?QW5kculzIE1hcnphbCBWYXJv?=) Date: Wed, 7 Aug 2002 18:40:09 +0200 Subject: [Python-=?iso-8859-15?B?ZXNdIL9DaWVycmVz?= en Python? In-Reply-To: <20020807111109.GA1292@foton.es> References: <20020807111109.GA1292@foton.es> Message-ID: <1028738409.3d514d692efb3@webmail.uji.es> Mensaje citado por Esteban Manchado Velázquez : Prueba con esto: class Clase: def __init__(self): # ... self.f = lambda con, msg, s=self: s.nuevoMensaje(con, msg) self.jabber.setMessageHandler(self.f) def nuevoMensaje(self, con, msg): print "He recibido un nuevo mensaje con el texto %s" % msg Si no te he entendido mal, tienes el mismo problema que surge al tartar de meter lambda-funciones como callbacks en aplicaciones que usan Tkinter. En ese otro contexto, el problema se soluciona como ves: se crea un parámetro con valor por defecto (le he llamado s, pero puedes llamarle self) y se le asigna el valor por defecto self. El valor por defecto se establece en el contexto de ejecución de creación de la lambda-función, así que debería solucionar tu problema. Salud. Andrés. From zoso en demiurgo.org Wed Aug 7 20:22:23 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Wed, 7 Aug 2002 19:22:23 +0100 Subject: =?iso-8859-1?Q?=5BPyth?= =?iso-8859-1?Q?on-es=5D_=BFCierres?= en Python? In-Reply-To: <1028738409.3d514d692efb3@webmail.uji.es> References: <20020807111109.GA1292@foton.es> <1028738409.3d514d692efb3@webmail.uji.es> Message-ID: <20020807182222.GC572@demiurgo.org> Ante todo, gracias a Hernán y Andrés por su ayuda. Al final conseguí resolverlo. On Wed, Aug 07, 2002 at 06:40:09PM +0200, Andrés Marzal Varo wrote: > Mensaje citado por Esteban Manchado Velázquez > : > > > [...] > Si no te he entendido mal, tienes el mismo problema que > surge al tartar de meter lambda-funciones como callbacks > en aplicaciones que usan Tkinter. s/Tkinter/Jabber/, pero la idea es la misma ;-) > En ese otro contexto, > el problema se soluciona como ves: se crea un parámetro > con valor por defecto (le he llamado s, pero puedes > llamarle self) y se le asigna el valor por defecto self. > El valor por defecto se establece en el contexto de > ejecución de creación de la lambda-función, así que > debería solucionar tu problema. Sí, eso soluciona el problema, gracias. En realidad tuve que darle cuatro parámetros, por unos detalles «turbios» de cómo se hace la llamada a la función que se registra como «de vuelta» :-) Pero en resumidas cuentas, era suficiente saber que los parámetros por omisión de las lambda se evaluaban en la creación y no en la llamada. Gracias a todos por la ayuda, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From rapto en arrakis.es Wed Aug 7 21:17:34 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 07 Aug 2002 21:17:34 +0200 Subject: [Python-es] Re: [Python-es] =?ISO-8859-1?Q?=BFCierres?= en Python? In-Reply-To: <20020807182222.GC572@demiurgo.org> References: <20020807111109.GA1292@foton.es> <1028738409.3d514d692efb3@webmail.uji.es> <20020807182222.GC572@demiurgo.org> Message-ID: <1028747855.1599.1.camel@renata.macondo.pri> Una pequeña puntualización, por meter baza: Los parámetros por defecto se evalúan en el momento de la definición para cualquier función, no sólo para las lambdas. El mié, 07-08-2002 a las 20:22, Esteban Manchado Velázquez escribió: > Ante todo, gracias a Hernán y Andrés por su ayuda. Al final conseguí > resolverlo. > > On Wed, Aug 07, 2002 at 06:40:09PM +0200, Andrés Marzal Varo wrote: > > Mensaje citado por Esteban Manchado Velázquez > > : > > > > > > [...] > > Si no te he entendido mal, tienes el mismo problema que > > surge al tartar de meter lambda-funciones como callbacks > > en aplicaciones que usan Tkinter. > > s/Tkinter/Jabber/, pero la idea es la misma ;-) > > > En ese otro contexto, > > el problema se soluciona como ves: se crea un parámetro > > con valor por defecto (le he llamado s, pero puedes > > llamarle self) y se le asigna el valor por defecto self. > > El valor por defecto se establece en el contexto de > > ejecución de creación de la lambda-función, así que > > debería solucionar tu problema. > > Sí, eso soluciona el problema, gracias. En realidad tuve que darle cuatro > parámetros, por unos detalles «turbios» de cómo se hace la llamada a la > función que se registra como «de vuelta» :-) Pero en resumidas cuentas, era > suficiente saber que los parámetros por omisión de las lambda se evaluaban en > la creación y no en la llamada. > > Gracias a todos por la ayuda, > > -- > Esteban Manchado Velázquez - http://www.demiurgo.org > No software patents in Europe! - freepatents.org - proinnova.hispalinux.es > Join Amnesty International - http://www.amnesty.org/actnow From perezj en si.uji.es Thu Aug 8 09:53:22 2002 From: perezj en si.uji.es (Jose Alejandro Perez Rubio) Date: 08 Aug 2002 09:53:22 +0200 Subject: [Python-es] =?ISO-8859-1?Q?=BFCierres?= en Py thon? In-Reply-To: <20020723091330.19268.qmail@web20907.mail.yahoo.com> References: <20020723091330.19268.qmail@web20907.mail.yahoo.com> Message-ID: <1028793202.1625.49.camel@pipa.uji.es> Buenos días, He leído el problema que se describía inicialmente, y parece que la solución pasa por crear una función lambda con un valor por defecto en uno de sus parámetros. Pero yo he probado esto: $ python2.2 >>> class foo : ... def __init__( self, m ): ... self.msg = m ... def handler( self, x,y ): ... print "Soy %s %d %d" % ( self.msg, x, y ) ... >>> f = foo( "Luis" ) >>> a = f.handler >>> a( 3,4 ) Soy Luis 3 4 Cuando llamamos se ejecuta 'a( 3,4 )' estamos llamando a la metodo handler de la instacia contenida por f Creo entender el problema inicial, pero si esto funciona por que no hacer ... ------------------------- 8< ------------------------- class Clase: def __init__(self): # ... # self.f = lambda con, msg: self.nuevoMensaje(con, msg) # # vvvvvvvvvvvvvvvvv self.jabber.setMessageHandler( self.nuevoMensaje ) def nuevoMensaje(self, con, msg): print "He recibido un nuevo mensaje con el texto %s" % msg ------------------------- >8 ------------------------- Recordaba algún caso parecido, pero no se donde, en cualquier caso probé lo siguiente: class registre: def add( self, prg): self.prg = prg def exe( self ): self.prg( 1,2 ) def loop( self ): import os, time if os.fork() == 0 : for i in range(4): self.exe() time.sleep(1) class foo: def __init__( self, msg ): self.msg = msg self.rg = registre() # Esto debía ser algo parecido a Jabber self.rg.add( self.handler ) self.rg.loop() def handler( self, x, y ): print self.msg, x, y foo( "Aun vivo" ) Y obtuve lo que se podía esperar: Aun vivo 1 2 Aun vivo 1 2 Aun vivo 1 2 Aun vivo 1 2 ¿Quizá no entendido nada? o ¿Jabber hace algo raro con sus MessageHandlers? Un saludo From zoso en demiurgo.org Thu Aug 8 15:21:52 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Thu, 8 Aug 2002 14:21:52 +0100 Subject: =?iso-8859-1?Q?=5BPyth?= =?iso-8859-1?Q?on-es=5D_=BFCierres?= en Py thon? In-Reply-To: <1028793202.1625.49.camel@pipa.uji.es> References: <20020723091330.19268.qmail@web20907.mail.yahoo.com> <1028793202.1625.49.camel@pipa.uji.es> Message-ID: <20020808132152.GH468@foton.es> On Thu, Aug 08, 2002 at 09:53:22AM +0200, Jose Alejandro Perez Rubio wrote: > [...] > Creo entender el problema inicial, pero si esto funciona por que no > hacer ... > > [...] > > Recordaba algún caso parecido, pero no se donde, en cualquier caso > probé lo siguiente: > [...] > Y obtuve lo que se podía esperar: > [...] > > ¿Quizá no entendido nada? o ¿Jabber hace algo raro con sus > MessageHandlers? Pues eso parece, porque creo que probé a pasar como manejador un «self.metodo» (como dice la anterior solución que propones) y no podía. En cualquier caso, está arreglado (con una función lambda con un parámetro con valor por omisión). La solución final fue crear una función lambda con cuatro parámetros (porque había un tercero optativo en la función de vuelta): --------------------------- 8< --------------------------- class foo: def __init__(self): # ... self.mensajeJabberLambda = \ lambda con, msg, out, s = self: s.mensajeJabber(con, msg) self.jabberCon.setMessageHandler(self.mensajeJabberLambda) # ... def mensajeJabber(self, con, msg): print "¡Mensaje nuevo! %s" % msg --------------------------- >8 --------------------------- Probablemente, en «condiciones normales», habrían funcionado las propuestas que enviaron, pero me da que hay algo muy raro en la llamada que hace el Jabber. Bueno, gracias a todos de nuevo. Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From mozca en colectivoquimica.dnsalias.org Fri Aug 9 09:38:54 2002 From: mozca en colectivoquimica.dnsalias.org (mozca en colectivoquimica.dnsalias.org) Date: Fri, 9 Aug 2002 02:38:54 -0500 (CDT) Subject: [Python-es] expresiones regulares y mi profe al final dice... In-Reply-To: Message-ID: On Fri, 2 Aug 2002, Hernan Martinez Foffani wrote: > > > preguntale si podés usar alguna biblioteca o extension para > > > parsers, de esas que te permiten definir la gramatica o si > > > también tenés que hacer eso a mano. > > > > la hay en python? he mirado por encima, como ya he dicho, me he > > puesto con lo otro, pero he visto > > parsers para XML, http y algo mas, pero no he visto nada a lo que > > echarle un vistazo, o te > > refieres a el 'parser -- Access Python parse trees'?. > > no "vienen" con python. son bibliotecas de terceras partes. > se mencionaron algunas en un mail anterior en este mismo hilo > de conversacion. si... fue en un mensaje de Esteban del que > me tomo la libertad de transcribir: > > ------------- > ...herramienta que te automatice el trabajo sucio. Mirando un > poquito en Google encontré una que parece que te vendrá bien. > Se llama Yapps, y está en > > http://theory.stanford.edu/~amitp/Yapps/ > > También está PLY, que parece más completo (y tiene enlaces a > otros proyectos): > > http://systems.cs.uchicago.edu/ply/ > > Por último, parece que el peso pesado de los meta-compiladores > de Python es SPARK, que es el que usa el Parrot (!): > > http://pages.cpsc.ucalgary.ca/~aycock/spark/ > http://gnosis.cx/publish/programming/charming_python_b6.html > > En la página oficial de Python tienes un apartado sobre esto: > > http://www.python.org/sigs/parser-sig/ > > Seguro que alguno te sirve (probablemente el primero, Yapps). > ----------------- > > Saludos, > -Hernan > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > From mostroratas en yahoo.es Thu Aug 8 18:49:40 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 8 Aug 2002 18:49:40 +0200 (CEST) Subject: como llamar al __init__ de la clase padre Message-ID: <20020808164940.55195.qmail@web20901.mail.yahoo.com> Hola a todos, tengo un codigo con dos clases, donde una hereda del la otra: class BoolOp(Predicate): def __init__(self, arg1, arg2): "Receives two arguments at initialitation time" self.arg1 = arg1 self.arg2 = arg2 # BoolOp do nothing by itself and should not be usable directly: self.op = None def evaluate(self): if self.op == None: raise AttributeError, 'Operator must be given: "and" or "or"' else: return apply(self.op, (self.arg1, self.arg2)) class Or(BoolOp): """Simple class for the string 'or' or the symbol '|' """ def __init__(self, arg1, arg2): BoolOp.__init__(self, arg1, arg2) <------------- self.op = lambda x, y : x or y he puesto esto asi por que me parece lo logico, pero... mi duda es saber si realmente esto esta bien? si se debe hacer asi? lo he probado y va bien, por lo que supongo que si, pero no se si esto puede darme problemas en el futuro o no. >>> p= And(1,0) >>> print p.evaluate() 0 >>> p2= Or(0,1) >>> print p2.evaluate() 1 >>> Gracias. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From pabloruiz en gnu.org Sun Aug 11 19:05:52 2002 From: pabloruiz en gnu.org (Pablo Ruiz =?ISO-8859-1?B?Tfp6cXVpeg==?=) Date: Sun, 11 Aug 2002 19:05:52 +0200 Subject: [Python-es] Glade Pythongenerator Message-ID: <20020811190552.1a422eaf.pabloruiz@gnu.org> Releyendo mensajes antiguos he encontrado uno de kmilo en donde comentaba sus experiencias con anjuta y glade y suspiraba porque glade no generase código python directamente (igual que lo hace con perl, podría hacerlo con python a través de un script). Yo también encontré glc.py pero no me ha funcionado nada bien (el indent es erróneo y no entiende muchas clases de gnome) Por lo que veo en la web, está bastante abandonado. ¿alguien podría convertir mi .glade a un .py decente. la aplicación es muy sencillita y puede encontrarse en mi web http://elenya.net (sección trabajos) bajo el nombre de Biblioteca de Annúminas. se trata de una utilidad para gestionar fichas bibliográficas de libros (en plan amateur, por supuesto). y es mi primera aplicación hecha con Glade, libglade y python (aunque ya llevo usando python mucho tiempo). Gracias PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya algo parecido a glade con QT y libre. -- Pablo Ruiz Múzquiz pabloruiz en gnu.org :: http://elenya.net --------------------------------------- GPG -> http://elenya.net/pabloruiz --------------------------------------- From kmilo en softhome.net Sun Aug 11 21:42:01 2002 From: kmilo en softhome.net (kmilo) Date: Sun, 11 Aug 2002 14:42:01 -0500 Subject: [Python-es] Visual Python Message-ID: <20020811144201.6e1fbe76.kmilo@softhome.net> Alguien a trabajado con visual Studio .NET, que tal??? -- NT requires less knowledge and competence than Linux does, but then it takes less competence to ride a tricycle than it does a Harley. You decide which one you'd rather have on the road. Kmilo Freelance de E.U. LUGUNAR (http://www.lugunar.com) Orgulloso Estudiante de 1 semestre de Ingenieria de Sistemas Universidad Distrital Francisco Jose de Caldas ( Bogota Colombia ) Linux user number 269263 Homepage: http://kmiloweb.netfirms.com/ From toomany en toomanyhq.homeunix.net Mon Aug 5 11:46:02 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Mon, 5 Aug 2002 11:46:02 +0200 Subject: [Python-es] Interface con Postgresql Message-ID: <200208051146.02022.toomany@toomanyhq.homeunix.net> Buenas. Tengo a mi alcance el uso de dos módulos distintos para interactuar entre Python y PostgreSQL; el pyPgSQL y el PyGreSQL. ¿Cual de los dos sabeis que sea más avanzado, mejor o más completo? Por la descripción creo que el primero, pero como soy un "pardillaco total 7" no sé... ¿Una ayudita, pliz? Gracias. -- Have a nice day ;-) TooManySecrets From aloy en ctv.es Tue Aug 13 01:07:16 2002 From: aloy en ctv.es (Antoni Aloy =?iso-8859-1?q?L=F3pez?=) Date: Tue, 13 Aug 2002 01:07:16 +0200 Subject: [Python-es] Glade Pythongenerator In-Reply-To: <20020811190552.1a422eaf.pabloruiz@gnu.org> References: <20020811190552.1a422eaf.pabloruiz@gnu.org> Message-ID: <200208130107.16661.aloy@ctv.es> El Dom 11 Ago 2002 19:05, Pablo Ruiz Múzquiz escrigué: > > PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya algo > parecido a glade con QT y libre. El designer que acompaña a QT por ejemplo, más la combinación pyuic, pyQT y pyKDE, de la que acaba de salir el port para KDE 3.0.2. Para Python es la combinación perfecta! Si no quieres salir de GTK también puedes testear el entorno Boa Constructor, que emplea wx. Aunque está en fase alfa promete bastante y es utilizable. Saludos, -- Antoni Aloy López Binissalem - Mallorca Linux Registered User # 210825 Gentoo Powered From kmilo en softhome.net Tue Aug 13 05:27:16 2002 From: kmilo en softhome.net (kmilo) Date: Mon, 12 Aug 2002 22:27:16 -0500 Subject: Glade Pythongenerator In-Reply-To: <20020811190552.1a422eaf.pabloruiz@gnu.org> References: <20020811190552.1a422eaf.pabloruiz@gnu.org> Message-ID: <20020812222716.2729372c.kmilo@softhome.net> Al final la cosa quedo al menos por mi parte en que es mejor usar el .xml que genera glade, con la ayuda de libglade On 25 Jul 2002 18:29:21 +0200 Marcos Sánchez Provencio wrote: > ¿No es más interesante dejar los ficheros glade como están y utilizarlos > directamente desde Python? Había un tutorial de cómo hacer pizzas: > > http://www.ukuug.org/events/linux2001/papers/html/CEgli/Gnome-Talk.html On Sun, 11 Aug 2002 19:05:52 +0200 Pablo Ruiz Múzquiz wrote: > Releyendo mensajes antiguos he encontrado uno de kmilo en donde > comentaba sus experiencias > con anjuta y glade y suspiraba porque glade no generase código python > directamente (igual que lo hace con perl, podría hacerlo con python a > través de un script). > > Yo también encontré glc.py pero no me ha funcionado nada bien (el indent > es erróneo y no entiende muchas clases de gnome) > Por lo que veo en la web, está bastante abandonado. > > ¿alguien podría convertir mi .glade a un .py decente. > > la aplicación es muy sencillita y puede encontrarse en mi web > http://elenya.net (sección trabajos) bajo el nombre de Biblioteca de > Annúminas. > se trata de una utilidad para gestionar fichas bibliográficas de libros > (en plan amateur, por supuesto). y es mi primera aplicación hecha con > Glade, libglade y python (aunque ya llevo usando python mucho tiempo). > > Gracias > > PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya algo > parecido a glade con QT y libre. > > -- > Pablo Ruiz Múzquiz > pabloruiz en gnu.org :: http://elenya.net > --------------------------------------- > GPG -> http://elenya.net/pabloruiz > --------------------------------------- > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es -- NT requires less knowledge and competence than Linux does, but then it takes less competence to ride a tricycle than it does a Harley. You decide which one you'd rather have on the road. Kmilo Freelance de E.U. LUGUNAR (http://www.lugunar.com) Orgulloso Estudiante de 1 semestre de Ingenieria de Sistemas Universidad Distrital Francisco Jose de Caldas ( Bogota Colombia ) Linux user number 269263 Homepage: http://kmiloweb.netfirms.com/ From rapto en arrakis.es Tue Aug 13 09:47:53 2002 From: rapto en arrakis.es (rapto) Date: Tue, 13 Aug 2002 07:47:53 GMT Subject: [Python-es] Interface con Postgresql Message-ID: <311662d50c.2d50c31166@page.melange.net> Bueno, es casi offtopic, pero aquí http://sindominio.net/cgi-bin/wh2001/wiki.pl?PythonApliReal estoy montando una charla de cómo hacer un weblog basado en Webware y PostgreSQL. Viene algún ejemplo de cómo conectar a pg. Y, como siempre, se admiten colaboradores y asistentes a la charla. ----- Mensaje Original ----- Remitente: TooManySecrets Fecha: Lunes, Agosto 5, 2002 11:46 am Asunto: [Python-es] Interface con Postgresql > Buenas. > > Tengo a mi alcance el uso de dos módulos distintos para > interactuar entre > Python y PostgreSQL; el pyPgSQL y el PyGreSQL. ¿Cual de los dos > sabeis que > sea más avanzado, mejor o más completo? Por la descripción creo > que el > primero, pero como soy un "pardillaco total 7" no sé... > ¿Una ayudita, pliz? Gracias. > > -- > Have a nice day ;-) > TooManySecrets > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > From zoso en demiurgo.org Tue Aug 13 10:35:22 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Tue, 13 Aug 2002 09:35:22 +0100 Subject: Interface con Postgresql In-Reply-To: <200208051146.02022.toomany@toomanyhq.homeunix.net> References: <200208051146.02022.toomany@toomanyhq.homeunix.net> Message-ID: <20020813083522.GB531@foton.es> On Mon, Aug 05, 2002 at 11:46:02AM +0200, TooManySecrets wrote: > Buenas. > > Tengo a mi alcance el uso de dos módulos distintos para interactuar entre > Python y PostgreSQL; el pyPgSQL y el PyGreSQL. ¿Cual de los dos sabeis que > sea más avanzado, mejor o más completo? Por la descripción creo que el > primero, pero como soy un "pardillaco total 7" no sé... > ¿Una ayudita, pliz? Gracias. Hace poquito estuve mirando las posibilidades de conexión a PG desde Python. Hice una lista con lo que me llamó la atención de cada posibilidad: ------------------------- 8< ------------------------- Las interfaces de Python para acceder a PostGresSql : - PoPy, en http://popy.sourceforge.net/ . Después de investigar un poco, parece que el desarrollo sigue en http://cvs.nekhem.com/cgi-bin/cvsweb/popy/ . Lo malo es que, al parecer, la última vez que tocaron el programa fue hace casi un año (mal rollo). - pyPgSQL, en http://pypgsql.sourceforge.net/ . Hace unos dos meses que lo tocaron por última vez, así que parece vivo. Puede usarse tanto la interfaz de PostgreSQL como la DB API 2.0 de Python (hay dos módulos diferentes). - psycopg, en http://initd.org/software/initd/psycopg . Lo tocaron hace menos de un mes, y dicen que está diseñado para ser rápido y compacto. Cumple la DB API 2.0 y dice que usa conexiones persistentes, por rendimiento. También dice que es ideal para usarla con aplicaciones multihilo. Hay versiones para Python 1.5, 2.0 y 2.1. La leche. - PyGreSQL, en http://www.druid.net/pygresql/ . Parece que la última versión de Python con la que funciona es la 2.1 (la que usamos por ahora, pero...). Parece que es la interfaz «oficial» de PostgreSQL. ------------------------- >8 ------------------------- Resumiendo, la que me pareció mejor fue la psycopg, aunque no he hecho pruebas de rendimiento ni nada parecido. Además, es la que usa rapto en la aplicación de ejemplo de sindominio.net. Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From toomany en toomanyhq.homeunix.net Tue Aug 13 10:49:18 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Tue, 13 Aug 2002 10:49:18 +0200 Subject: [Python-es] Interface con Postgresql In-Reply-To: <20020813083522.GB531@foton.es> References: <200208051146.02022.toomany@toomanyhq.homeunix.net> <20020813083522.GB531@foton.es> Message-ID: <200208131049.18357.toomany@toomanyhq.homeunix.net> Muchísimas gracias por esta magnífica explicación. La "vuelvo" a dejar aquí en esta contestación por si alguien, por la razón que sea, no la ha podido pillar. Gracias de nuevo. On Tuesday 13 August 2002 10:35, Esteban Manchado Velázquez wrote: > Hace poquito estuve mirando las posibilidades de conexión a PG desde > Python. Hice una lista con lo que me llamó la atención de cada posibilidad: > > ------------------------- 8< ------------------------- > Las interfaces de Python para acceder a PostGresSql : > > - PoPy, en http://popy.sourceforge.net/ . Después de investigar un poco, > parece que el desarrollo sigue en > http://cvs.nekhem.com/cgi-bin/cvsweb/popy/ . Lo malo es que, al parecer, la > última vez que tocaron el programa fue hace casi un año (mal rollo). > - pyPgSQL, en http://pypgsql.sourceforge.net/ . Hace unos dos meses que lo > tocaron por última vez, así que parece vivo. Puede usarse tanto la > interfaz de PostgreSQL como la DB API 2.0 de Python (hay dos módulos > diferentes). - psycopg, en http://initd.org/software/initd/psycopg . Lo > tocaron hace menos de un mes, y dicen que está diseñado para ser rápido y > compacto. Cumple la DB API 2.0 y dice que usa conexiones persistentes, por > rendimiento. También dice que es ideal para usarla con aplicaciones > multihilo. Hay versiones para Python 1.5, 2.0 y 2.1. La leche. > - PyGreSQL, en http://www.druid.net/pygresql/ . Parece que la última > versión de Python con la que funciona es la 2.1 (la que usamos por ahora, > pero...). Parece que es la interfaz «oficial» de PostgreSQL. > ------------------------- >8 ------------------------- > > Resumiendo, la que me pareció mejor fue la psycopg, aunque no he hecho > pruebas de rendimiento ni nada parecido. Además, es la que usa rapto en la > aplicación de ejemplo de sindominio.net. > > Saludos, -- Have a nice day ;-) TooManySecrets From aerd en retemail.es Tue Aug 13 20:17:52 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Tue, 13 Aug 2002 20:17:52 +0200 Subject: [Python-es] =?iso-8859-1?Q?=BFComo_quereis_la_Interfaz_=28API=29_de_la_capa_de_persis?= =?iso-8859-1?Q?tencia=3F?= Message-ID: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> Estimados señores, estoy diseñando una nueva capa de persistencia de objetos para Python >= 2.2 La idea es que uno especifica en un archivo de texto con las clases y sus atributos respectivos (nombre, tipo, etc.). Posteriormente, el software genera una parte de código y hace cosas especiales internamente. La capa de persistencia permitirá persistir hacia bases de datos relacionales, no relacionales (tipo BSDDB), archivos de texto plano, pickles y XML. Incluso los atributos de una misma instancia de clase podrán persistir en diferentes mecanismos de persistencias. La capa soportará transacciones. (Ver final del correo para un ejemplo de uso.) ========================================== Quiero que me digáis cuál es la manera que más os gusta para acceder a los atributos de una instancia. Suponed que la clase de 'Persona' tiene los atributos 'nombre' tipo string, 'apellidos' tipo string y 'edad' tipo entero. ================= Alternativa 1: p=Persona() p.nombre='Pepe' # establecer nuevo valor p.apellidos='Pérez' # igual p.edad=54 # igual print "La edad de ",p.nombre, " es ", p.edad # Lectura de atributos # Acceder a meta-datos: print "el nombre del campo es", p._class.apellidos.name print " y su tipo es ", p._class.apellidos.type if p._class.apellidos.validationRule: print "Regla de validación: ", p._class.apellidos.validationRule ================= Alternativa 2: p=Persona() p.nombre.value='Pepe' # establecer nuevo valor (.value podria obviarse) p.apellidos.value='Pérez' # igual p.edad.value=54 # igual print "La edad de ",p.nombre.value, " es ", p.edad.value # Lectura de atributos # Aqui .value no se puede obviar porque no se si accede al atributo o a su valor, ver linea siguiente # Acceder a meta-datos: print "el nombre del campo es", p.apellidos.name, " y su tipo es ", p.apellidos.type if p.apellidos.validationRule: print "Regla de validación: ", p.apellidos.validationRule # Aquí _class no hace falta, porque al especificar # .value explicitamente, puedo hacer que todos los # demas atributops se busquen en la definición de la clase. ===================== Alternativa 3 (tipo Webware.MiddleKit): # para cada atributo 'x' se crea un atributo interno _x, # un método para leerlo x() y otro para modificar setx(): p=Persona() p.setnombre('Pepe') # establecer nuevo valor (.value podria obviarse) p.setapellidos('Pérez') # igual p.setedad(54) # igual print "La edad de ",p.nombre(), " es ", p.edad() # Lectura de atributos # Acceder a meta-datos: print "el nombre del campo es", p.klass().apellidos.name(), " y su tipo es ", p.klass().apellidos.type() if p.klass().apellidos.validationRule(): print "Regla de validación: ", p.klass().apellidos.validationRule() ======================= El problema: Ya os habéis dado cuenta que mi problema es que: x=objeto.atributo # debería devolver el valor no la referencia al atributo y=objeto.atributo.type # debería devolver el tipo de atributo (sacado de la definición de clase) pero dado que no sé cómo se puede hacer, tengo que buscar una alternativa. ======================= Ejemplos de la api: from Persistence import PersistenteManager # es singleton # Empezar una transacción. Todas las operaciones de usuario se realizan sobre una transacción siempre. trans=PersistenceManager.Transaction() # Crear un objeto vendedor=Agente() vendedor.nombre="Erny" trans.add(vendedor) # Agregar objeto a la transacción # Recuperar objetos: resultado=trans.retrieve(oql="SELECT c FROM Clientes c WHERE c.nombre LIKE 'A*'") # iterar sobre objetos while resultado.hasMore(): c=resultado.next() # Modificar un atributo c.vendedor=vendedor # llamar a un método c.display() # borrar un elemento (el último de los anteriores) del c # No sé todavía si va a ser 'c.delete()' o 'del c' # finalmente grabar todas las modificaciones realizadas. trans.commit() ======================== Usos previstos: Aplicaciones cualesquiera con un conjunto importante de clases persistentes (>30) , en entorno web u otro. Persistencia inicial prevista para cualquier base de datos relacional con interfaz DB-API 2.0, texto plano, más tarde XML, (quizá pickle también). Posibilidad de guardar versiones antiguas de los objetos en otra base de datos. ======================== Anotaciones: * La api y toda la capa están en diseño. * Las transacciones se pueden reaprovechar, pero llamar a trans.begin() no es necesario porque se hace automáticamente * trans.commit() oculta la lógica de bloqueos y transacciones sobre los mecanismos de persistencia * trans.retrieve() probablemente devuelva una especie de cursor, los objetos no se leen realmente hasta acceder a ellos. * resultado.next(): al leer el objeto, se situarán bloqueos de lectura en la base de datos, para obtener imágenes consistentes de objetos que se almacenan en varias tablas * existirá una caché compartida entre todas las transacciones. * las modificaciones desde una transacción no serán visibles desde otras transacciones (y por tanto otros usuarios) hasta realizar un 'commit'. * Probablemente existirán diferentes versiones en caché de un mismo objeto. El mecanismo en este caso sería como el de Postgresql MultiVersionCurrencyControl * Falta por resolver la actualización de sumas globales acumuladas, y otros objetos (como contadores) frecuentemente actualizados desde muchos puestos (en este caso, habría que recuperar el objeto y reaplicarle las operaciones realizadas, como el aumento en una cantidad). * La idea incial y gran parte del trabajo está basado en Webware / MiddleKit de Chuck Esterbrook. ========================== Documentación: Webware MiddleKit : http://webware.sourceforge.net/Webware-0.7/MiddleKit/Docs/index.html Castor (Java Persistence Layer): www.castor.org Persisten Layer (Java): http://player.sourceforge.net Diseño de capas de persistencia (Scott Ambler, inglés): http://www.ambysoft.com/persistenceLayer.html y documentos relacionados. Voluntarios bienvenidos. (ponerse en contacto conmigo: aerd en retemail.es) Gracias, Erny From jaimearias en terra.cl Tue Aug 13 21:59:27 2002 From: jaimearias en terra.cl (Jaime Arias) Date: Tue, 13 Aug 2002 15:59:27 -0400 Subject: cobol + python Message-ID: <001301c24303$ef0ee990$55f31cc8@server> alguien a experimentado con python y una bd hecha en cobol ? Gracias. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rapto en arrakis.es Tue Aug 13 22:22:44 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 13 Aug 2002 22:22:44 +0200 Subject: [Hispapyzope-zope] =?ISO-8859-1?Q?=BFComo?= quereis la Interfaz (API) de la capa de persistencia? In-Reply-To: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> Message-ID: <1029270165.1945.0.camel@renata.macondo.pri> Voto la 1 El mar, 13-08-2002 a las 20:17, Ernesto Revilla escribió: > ================= > Alternativa 1: > > p=Persona() > p.nombre='Pepe' # establecer nuevo valor > p.apellidos='Pérez' # igual > p.edad=54 # igual > > print "La edad de ",p.nombre, " es ", p.edad # Lectura de atributos > > # Acceder a meta-datos: > print "el nombre del campo es", p._class.apellidos.name > print " y su tipo es ", p._class.apellidos.type > if p._class.apellidos.validationRule: > print "Regla de validación: ", p._class.apellidos.validationRule > From hernan en orgmf.com.ar Wed Aug 14 09:58:10 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Wed, 14 Aug 2002 09:58:10 +0200 Subject: cobol + python In-Reply-To: <001301c24303$ef0ee990$55f31cc8@server> References: <001301c24303$ef0ee990$55f31cc8@server> Message-ID: > alguien a experimentado con python y una bd hecha en cobol ? mm.... ¿podés dar mas datos? sistema operativo, version de cobol y si es interprete o compilador, y de ser posible detalles sobre el respositorio de datos. saludos, -Hernan From hernan en orgmf.com.ar Wed Aug 14 11:12:25 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Wed, 14 Aug 2002 11:12:25 +0200 Subject: =?iso-8859-1?Q?RE:_=5BHispapyzope-zope=5D_=BFComo_quereis_la_Interfaz_=28?= =?iso-8859-1?Q?API=29_de_la_capa_de_persistencia=3F?= In-Reply-To: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> Message-ID: > ========================================== > Quiero que me digáis cuál es la manera que más os gusta para acceder a los > atributos de una instancia. la 1. > Suponed que la clase de 'Persona' tiene los atributos 'nombre' > tipo string, 'apellidos' tipo string y 'edad' tipo entero. mmm.... ¿y si: p.edad = "cincuenta y cuatro" ? ;-) > ================= > Alternativa 1: > > p=Persona() > p.nombre='Pepe' # establecer nuevo valor > p.apellidos='Pérez' # igual > p.edad=54 # igual > > print "La edad de ",p.nombre, " es ", p.edad # Lectura de atributos ok. > # Acceder a meta-datos: > print "el nombre del campo es", p._class.apellidos.name > print " y su tipo es ", p._class.apellidos.type > if p._class.apellidos.validationRule: > print "Regla de validación: ", p._class.apellidos.validationRule ¿a qué llamas metadatos? ¿a los objetos que irían en la DDL (data definition language)? o sea que imprimirian esas 4 ultimas lineas? además, ¿como se especificaría la clase Persona? -Hernan From rapto en arrakis.es Thu Aug 15 13:04:51 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 15 Aug 2002 13:04:51 +0200 Subject: Las ciencias adelantan Message-ID: <1029409492.2221.23.camel@renata.macondo.pri> He puesto una página que explica cómo usar un servidor remoto de nombres (me parece que antiguos) de provincias españolas a partir del CP. http://sindominio.net/cgi-bin/wh2001/wiki.pl?XmlRpc From aloy en ctv.es Fri Aug 16 22:00:14 2002 From: aloy en ctv.es (Antoni Aloy =?iso-8859-1?q?L=F3pez?=) Date: Fri, 16 Aug 2002 22:00:14 +0200 Subject: =?iso-8859-1?q?=5BPython-es=5D =BFComo=20quereis=20la=20Interfaz?= (API) de la capa de persistencia? In-Reply-To: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> Message-ID: <200208162200.14911.aloy@ctv.es> El Mar 13 Ago 2002 20:17, Ernesto Revilla escrigué: Hola! En Parnasus aparece un enlace hacia http://opensource.theopalgroup.com/ que si bien no representa una capa depersistencia completa sí que modela los objetos de manera que sean fácilmente accesibles. Saludos, -- Antoni Aloy López Binissalem - Mallorca Linux Registered User # 210825 Gentoo Powered From aerd en retemail.es Sat Aug 17 00:36:20 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sat, 17 Aug 2002 00:36:20 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5D_Re:_=5BPython-es=5D=BFComo_quereis_la_?= =?iso-8859-1?Q?Interfaz_=28API=29_de_la_capa_de_persistencia=3F?= References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> <200208162200.14911.aloy@ctv.es> Message-ID: <002601c24579$69fb4730$0100a8c0@sicem.biz> Hola > En Parnasus aparece un enlace hacia http://opensource.theopalgroup.com/ que si > bien no representa una capa depersistencia completa sí que modela los objetos > de manera que sean fácilmente accesibles. Gracias por el enlace. Le echaré un vistazo. No me había enterado hasta ayer que este Julio se había creado un nuevo SIG sobre persistencia. Para los interesados: http://www.python.org/sigs/persistence-sig/ Después de que Java Data Objects ya está desde hace más de 2 años, ya es hora que Python se oriente un poco más hacia las necesidades empresariales. Ya he visto el enlace, pero no he visto nada muy interesante aunque sé que la gente de OPAL está trabajando en ello (a través de la lista de correo de persistence-sig). De todos modos, Gracias From aerd en retemail.es Sat Aug 17 01:04:57 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sat, 17 Aug 2002 01:04:57 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DRE:_=5BHispapyzope-zope=5D_=BFComo_?= =?iso-8859-1?Q?quereis_la_Interfaz_=28API=29_de_la_capa_de_persistencia=3F?= References: Message-ID: <002701c24579$6b97e030$0100a8c0@sicem.biz> > > Suponed que la clase de 'Persona' tiene los atributos 'nombre' > > tipo string, 'apellidos' tipo string y 'edad' tipo entero. > > mmm.... ¿y si: > p.edad = "cincuenta y cuatro" Daría alguna excepción, como InvalidTypeException. Eso es porque p.edad es una 'property' al tipo Python 2.2. al que se asocia una función set_edad que chequea el tipo (isinstance("cincuenta y cuatro",int) daría negativo), aunque, si quieres puedes redefinir la función en una clase heredada que llama a una rutina de conversión. > > # Acceder a meta-datos: > > print "el nombre del campo es", p._class.apellidos.name > > print " y su tipo es ", p._class.apellidos.type > > if p._class.apellidos.validationRule: > > print "Regla de validación: ", p._class.apellidos.validationRule > > ¿a qué llamas metadatos? ¿a los objetos que irían en la DDL (data > definition language)? o sea que imprimirian esas 4 ultimas lineas? Sí. Meta-datos son datos sobre los datos ;-) > además, ¿como se especificaría la clase Persona? Buena pregunta: habrá un archivo de mapeo que indica qué clases hay, qué atributos llevan, de qué tipo son y en qué mecanismo de persistencia (sistema base de datos, tabla, campo...) hay que almacenarlo. El formato no está claro pero sería algo como esto: (Persona, class, {attributes: [ (nombre, string ), (apellidos, string ), (edad, integer ), ) Syntaxis es una tupla, donde el primer valor es el nombre (Persona), el segundo es el tipo y el tercero un diccionario de valores. Para el caso de 'attributes' viene una lista de atributos, donde cada elemento es una tupla igual que en la clase. La clase puede tener otros valores como si es abstracta, si tiene una regla de validación, etc. Los atributos pueden tener valores por defecto, reglas de validación, y para atributos que hacen referencias a otras clases, más datos (tipo de relación). A partir de este archivo se creará código Python para las clases como por ejemplo: class GenPersona(PersistentObject): def __init__(self): self._nombre='' self._apellidos='' self._edad=0 def get_nombre(self): return self._nombre def set_nombre(self,valor): # La rutina de establecer atributo de PersistentObject, comprueba el tipo # mediante isInstance, y la regla de validación si existe. Además # marca el objeto como modificado, y acutaliza el momento de la actualización # hará unas cuantas cosas más. PersistentObject._setvalue(self,"nombre",valor) nombre=property(get_nombre,set_nombre) ... los mismo para los atributos apellidos y edad. El texto generado nunca se modifica, porque hay que regenerarlo cada vez que se haya modificado el archivo de mapeo de clases. Si el usuario no ha especificado un archivo Persona.py con la clase Persona, esta se crea automáticamente así: class Persona(GenPersona): pass Se supone que el programador modifica esta clase a su gusto. Espero haber contestado tu pregunta. (Estas ideas salen de Webware / MiddleKit que encontrarás en http://webware.sourceforge.net .) Erny From aloy en ctv.es Sat Aug 17 02:15:29 2002 From: aloy en ctv.es (Antoni Aloy =?iso-8859-1?q?L=F3pez?=) Date: Sat, 17 Aug 2002 02:15:29 +0200 Subject: =?iso-8859-1?q?=5BPython-es=5D Re=3A=20=5BPython-es=5D=20Re=3A?= =?iso-8859-1?q?=20=5BPython-es=5D=BFComo=20quereis=20laInterfaz?= (API) de la capa de persistencia? In-Reply-To: <002601c24579$69fb4730$0100a8c0@sicem.biz> References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz> <200208162200.14911.aloy@ctv.es> <002601c24579$69fb4730$0100a8c0@sicem.biz> Message-ID: <200208170215.29601.aloy@ctv.es> > Después de que Java Data Objects ya está desde hace más de 2 años, ya es > hora que Python se oriente un poco más hacia las necesidades empresariales. > > Ya he visto el enlace, pero no he visto nada muy interesante aunque sé que > la gente de OPAL está trabajando en ello (a través de la lista de correo de > persistence-sig). > > De todos modos, Gracias No hay de qué. :D De todos modos creo que el trabajo de Opal es interesante, al menos para darle una ojeada. Tal como se plantean las clases de persistencia parece que siempre es condición indispensable disponer de una capa intermedia, de un middleware, la cual normalmente también implica un servidor de aplicaciones. La complejidad que conlleva un servidor de aplicaciones tanto a nivel de programación, mantenimiento por parte del cliente, y su lentitud intrínseca hoy por hoy no lo hacen muy aconsejable para aplicaciones de gestión de las de "toda la vida": contabilidad, gestión comercial, etc. Yo por ahora me conformaría con algo intermedio entre la capa de persistencia "académica" y la capa de persistencia "práctica". Aquí el trabajo de Opal se puede aprovechar bastante, ya que nos permitiría definir un objeto que haciendo uso de db_row mapease un registro de la base de datos. Queda por resolver por ahora el tema de detectar que se ha cambiado un valor del objeto ya que la generación de código SQL no es complicada. Saludos, -- Antoni Aloy López Binissalem - Mallorca Linux Registered User # 210825 Gentoo Powered From rapto en arrakis.es Sat Aug 17 12:17:45 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 17 Aug 2002 12:17:45 +0200 Subject: Glade Pythongenerator In-Reply-To: <20020811190552.1a422eaf.pabloruiz@gnu.org> References: <20020811190552.1a422eaf.pabloruiz@gnu.org> Message-ID: <1029579466.2238.1.camel@renata.macondo.pri> ¿En qué quedó todo esto? ¿Cuál era el problema de usar el glade? Me parece mucho mas pitonesco no compilar nada que no sea necesaro. El dom, 11-08-2002 a las 19:05, Pablo Ruiz Múzquiz escribió: > Releyendo mensajes antiguos he encontrado uno de kmilo en donde > comentaba sus experiencias > con anjuta y glade y suspiraba porque glade no generase código python > directamente (igual que lo hace con perl, podría hacerlo con python a > través de un script). > > Yo también encontré glc.py pero no me ha funcionado nada bien (el indent > es erróneo y no entiende muchas clases de gnome) > Por lo que veo en la web, está bastante abandonado. > > ¿alguien podría convertir mi .glade a un .py decente. > > la aplicación es muy sencillita y puede encontrarse en mi web > http://elenya.net (sección trabajos) bajo el nombre de Biblioteca de > Annúminas. > se trata de una utilidad para gestionar fichas bibliográficas de libros > (en plan amateur, por supuesto). y es mi primera aplicación hecha con > Glade, libglade y python (aunque ya llevo usando python mucho tiempo). > > Gracias > > PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya algo > parecido a glade con QT y libre. > > -- > Pablo Ruiz Múzquiz > pabloruiz en gnu.org :: http://elenya.net > --------------------------------------- > GPG -> http://elenya.net/pabloruiz > --------------------------------------- > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From pabloruiz en gnu.org Sat Aug 17 13:42:19 2002 From: pabloruiz en gnu.org (Pablo Ruiz =?ISO-8859-1?B?Tfp6cXVpeg==?=) Date: Sat, 17 Aug 2002 13:42:19 +0200 Subject: Glade Pythongenerator In-Reply-To: <1029579466.2238.1.camel@renata.macondo.pri> References: <20020811190552.1a422eaf.pabloruiz@gnu.org> <1029579466.2238.1.camel@renata.macondo.pri> Message-ID: <20020817134219.53b022aa.pabloruiz@gnu.org> El 17 Aug 2002 12:17:45 +0200 Marcos Sánchez Provencio escribió: > ¿En qué quedó todo esto? ¿Cuál era el problema de usar el glade? Me > parece mucho mas pitonesco no compilar nada que no sea necesaro. No, no. Si yo no quería compilar nada. Pero prefería (en aras de la multiplataformidad, olé el palabro) tener dos .py que no un .py y un .glade que me obligará a tener libglade en el ordenador (léase usuarios de windows, que haberlos haylos). Vamos, que veía más cómodo distribuir mi programa en plan python+GTK que no python+GTK+libglade. Eso era todo. Por eso pedía ayuda para convertir mi .glade a un .py (o dos como hace el glc.py), porque me da a mí que el glc.py lo hacía mal (lleva parado bastante tiempo según su web). Saludos. Elfo > > El dom, 11-08-2002 a las 19:05, Pablo Ruiz Múzquiz escribió: > > Releyendo mensajes antiguos he encontrado uno de kmilo en donde > > comentaba sus experiencias > > con anjuta y glade y suspiraba porque glade no generase código > > python directamente (igual que lo hace con perl, podría hacerlo con > > python a través de un script). > > > > Yo también encontré glc.py pero no me ha funcionado nada bien (el > > indent es erróneo y no entiende muchas clases de gnome) > > Por lo que veo en la web, está bastante abandonado. > > > > ¿alguien podría convertir mi .glade a un .py decente. > > > > la aplicación es muy sencillita y puede encontrarse en mi web > > http://elenya.net (sección trabajos) bajo el nombre de Biblioteca de > > Annúminas. > > se trata de una utilidad para gestionar fichas bibliográficas de > > libros(en plan amateur, por supuesto). y es mi primera aplicación > > hecha con Glade, libglade y python (aunque ya llevo usando python > > mucho tiempo). > > > > Gracias > > > > PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya > > algo parecido a glade con QT y libre. > > > > -- > > Pablo Ruiz Múzquiz > > pabloruiz en gnu.org :: http://elenya.net > > --------------------------------------- > > GPG -> http://elenya.net/pabloruiz > > --------------------------------------- > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es -- Pablo Ruiz Múzquiz pabloruiz en gnu.org :: http://elenya.net --------------------------------------- GPG -> http://elenya.net/pabloruiz --------------------------------------- From aerd en retemail.es Sun Aug 18 00:51:35 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sun, 18 Aug 2002 00:51:35 +0200 Subject: [Python-es] =?iso-8859-1?Q?Re:_=5BPython-es=5D_Re:_=5BPython-es=5DRe:_=5BPython-es=5D?= =?iso-8859-1?Q?_Re:_=5BPython-es=5D=BFComo_quereis_laInterfaz_=28AP?= =?iso-8859-1?Q?I=29_de_lacapa_de_persistencia=3F?= References: <006201c242f5$c64c38e0$0100a8c0@sicem.biz><200208162200.14911.aloy@ctv.es> <002601c24579$69fb4730$0100a8c0@sicem.biz> <200208170215.29601.aloy@ctv.es> Message-ID: <006101c24641$8fd673d0$0100a8c0@sicem.biz> ----- Original Message ----- From: "Antoni Aloy López" > Tal como se plantean las clases de persistencia parece que siempre es > condición indispensable disponer de una capa intermedia, de un middleware, la > cual normalmente también implica un servidor de aplicaciones. Eso no es cierto, aunque sea un uso habitual. Una aplicación simple de libreta de direcciones podría tener la capa de persistencia y por ejemplo MetaKit (http://www.equi4.com ) como base de datos. Igualmente, podría crearse una interfaz XML-RPC y dejar correr la capa con algún back-end de almacenamiento, tipo postgresql o ZODB correr como proceso servidor, lo que no llamaría 'servidor de aplicaciones' (sino más bien 'servidor de objetos). > La complejidad que conlleva un servidor de aplicaciones tanto a nivel de > programación, mantenimiento por parte del cliente, y su lentitud intrínseca > hoy por hoy no lo hacen muy aconsejable para aplicaciones de gestión de las > de "toda la vida": contabilidad, gestión comercial, etc. No estoy para nada de acuerdo contigo. Existen servidores de aplicaciones como BEA WebLogic, Lotus Domino, IBM Websphere o JBOSS que corren aplicaciones de gestión. Si te refieres a servidores Python, no se puede decir que Zope sea lento, aunque hay ciertas dificultades desde el punto de vista de creación de aplicaciones, por el fuerte marco al que se tienen que integrar (en concreto hay que configurar toda la seguridad para un producto, y tener en cuenta determinadas clases bases). Por otra parte, Guido y otros están destrás de Python, pero ninguna empresa grande, como SUN, que a demás de especificar Java, ha creado otras especificaciones orientadas al mundo empresarial, como JDBC, JTA/JTS, JDO, EJB, JNDI y muchos más. Si hubiese habido sólo la cuarta parte de publicidad para Python que para Java, ya habríamos llegado bastante más lejos. > Yo por ahora me conformaría con algo intermedio entre la capa de persistencia > "académica" y la capa de persistencia "práctica". Aquí el trabajo de Opal se > puede aprovechar bastante, ya que nos permitiría definir un objeto que > haciendo uso de db_row mapease un registro de la base de datos. Yo también hice una encapsulación para filas de tablas. Un concepto realmente interesante, pero ahora trabajaremos con alrededor de 100 tablas/clases para entre 20 y 40 clientes, y necesitamos algo más abstracto. Además, la capa no es tan académica como puedes ver en los white papers de Scott Ambler (www.ambysoft.com/persistenceLayer.html). Un gran + es crear la independencia respecto a los vendedores de RDBMS. Puede costar un ojo migrar por ejemplo entre Oracle a MSSQL. Cierto es que mi capa será lenta. Tiene que realizar chequeo de tipos, reglas de validación, registrar llamadas de métodos, comprobar la seguridad y actualizar otros valores sobre el objeto en cuestión. Realmente me da un poco miedo que no se pueda usar: Pero hay caché, las operaciones se realizan en RAM y el hardware en general no es demasiado caro. Ya os contaré. > Queda por resolver por ahora el tema de detectar que se ha cambiado un valor > del objeto ya que la generación de código SQL no es complicada. Yo consigo esto, porque dentro de las transacciones de usuario sólo existen objetos proxies que apuntan a otros objetos en la caché. Cualquier set crea una entrada en el diccionario __dict__ local, con lo que sólo se guardan las modificaciones. Y si un atributo no se encuentra en el objeto proxy , se busca en el objeto al que apunta. Python usa exáctamente el mismo mecanismo para instancias y clases. Erny From chemacortes en wanadoo.es Mon Aug 19 12:24:41 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-15?q?Cort=E9s?=) Date: Mon, 19 Aug 2002 12:24:41 +0200 Subject: Asignaciones e identidades Message-ID: <200208191224.41097.chemacortes@wanadoo.es> Hola a todos: Ya de vuelta de vacaciones, he hecho algunos deberes. Una de las cosas que me ha dado por estudiar es la relación entre asignaciones e identidades. He creado el siguiente test: >>> a=3 >>> b=3 >>> a is b 1 Aquí vemos que, aunque 'a' y 'b' se crean en diferentes sentencias, ambos son el mismo objeto!!!. He repetido el test para diversos tipos de datos y he obtenido los siguientes resultados: 3 true 3L false 3.0 false 3j false "" true () true [] false {} false No he encontrado una posible explicación que explique esta diferenciación que se hace entre tipos de datos. ¿Alguien tiene una explicación? Estudiando un poco más el tema de las identidades, centrado ya en las asignaciones de listas tenemos que, si 'L' es una lista: >>> s=L >>> s is L 1 >>> s=L[:] >>> s is L 0 >>> s==L 1 Vemos que la asignación opera de dos formas distintas: 1) en la primera asignación se da a 's' la misma referencia que tiene 'L'. Por así decirlo, es similar una asignación de "punteros". En C++ sería: ListType& s = L; 2) en la segunda asignación, la expresión 'L[:]' genera una nueva lista cuya referencia se asigna a 's'. En este caso, hay creación previa del nuevo objeto, cuya referencia se asigna a 's'. ListType& s = new ListType(L); El uso de operador de rebanado L[:] siempre es el que se ve como "truco" para realizar una "copia" de una lista. Todo consiste en forzar que la asignación se haga como en el segundo caso, para lo que se puede usar cualquier expresión que devuelva una lista igual a la original. 'L[:]' es el caso más visto, pero se podría utilizar otros operadores como el de replicación 'L*1' e incluso el de añadir 'L+[]'. ¿Alguna razón que haga más aconsejable el uso de L[:]? (Personalmente, me gusta más L*1 que L[:]). Espero no haber sido demasiado "espeso" con el tema, pero era algo que tenía aún por digerir. Saludos, Chema Cortés From hernan en orgmf.com.ar Mon Aug 19 14:53:30 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Mon, 19 Aug 2002 14:53:30 +0200 Subject: [Python-es] Asignaciones e identidades In-Reply-To: <200208191224.41097.chemacortes@wanadoo.es> Message-ID: > Una de las cosas que me ha dado por estudiar es la relación entre > asignaciones > e identidades. He creado el siguiente test: > > >>> a=3 > >>> b=3 > >>> a is b > 1 > > Aquí vemos que, aunque 'a' y 'b' se crean en diferentes > sentencias, ambos son el mismo objeto!!!. esto en python se llama "interning". no solo depende del tipo del objeto sino de su valor. por ejemplo, si en lugar de 3 probamos con otros numeritos... >>> a=99 >>> b=99 >>> a is b 1 >>> a=100 >>> b=100 >>> a is b 0 >>> es una optimizacion de python para evitar pagar el coste de creación de objetos. > He repetido el test para diversos tipos de datos y he > obtenido los siguientes resultados: > > 3 true > 3L false > 3.0 false > 3j false > "" true > () true > [] false > {} false > > No he encontrado una posible explicación que explique esta > diferenciación que se hace entre tipos de datos. > ¿Alguien tiene una explicación? solo se puede hacer "interning" sobre los tipos de datos inmutables. y dentro de ellos algunos se hace automaticamente y sobre otros no. por ejemplo, los strings se hacen interning solo si se "parecen" a un nombre de valido en python. >>> a = "variable" >>> b = "variable" >>> a is b 1 >>> a = "no es variable" >>> b = "no es variable" >>> a is b 0 >>> el programador puede forzar el interning de strings mediante el builting intern() > El uso de operador de rebanado L[:] siempre es el que se ve como > "truco" para realizar una "copia" de una lista. Todo consiste en > forzar que la asignación se haga como en el segundo caso, para > lo que se puede usar cualquier expresión que devuelva una lista > igual a la original. 'L[:]' es el caso más visto, pero se podría > utilizar otros operadores como el de replicación 'L*1' e incluso > el de añadir 'L+[]'. ¿Alguna razón que haga más aconsejable el > uso de L[:]? (Personalmente, me gusta más L*1 que L[:]). ¿será por velocidad? L[:] es el "idiom" mas usado. Saludos, -Hernan From hernan en orgmf.com.ar Mon Aug 19 15:29:05 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Mon, 19 Aug 2002 15:29:05 +0200 Subject: intern. era: Asignaciones e identidades In-Reply-To: References: Message-ID: una curiosidad es que los strings que están internos son inmortales: >>> a = "mi_variable" >>> b = "mi_variable" >>> a is b 1 >>> id(a) 10950008 >>> del a, b >>> en teoria no debieran quedar referencias activas al objeto "mi_variable". sin embargo >>> c = "mi_variable" >>> id(c) 10950008 <<---- es el mismo id! >>> de todas formas es casi seguro que esta propiedad sea quitada (o al menos restringida) en las proximas versiones del lenguaje. saludos, -Hernan From aerd en retemail.es Mon Aug 19 15:38:10 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Mon, 19 Aug 2002 15:38:10 +0200 Subject: Asignaciones e identidades References: <200208191224.41097.chemacortes@wanadoo.es> Message-ID: <000b01c24785$aa3e0950$0100a8c0@sicem.biz> Hola, se trata de tipos mutables y no mutables, por ejemplo el entero 3 es inmutable, no puedes cambiar 3. 3 es 3 y ya está. puedes asignar a una variable otro entero, pero es otro objeto. 3 y 3.0 no es lo mismo, aunque tengan un valor comparable. Son de tipos diferentes así que imposiblemente pueden ser el mismo objeto. Por cierto, los float también son inmutables. Cadenas de caracteres, en contra de lo esperado, son también inmutables. Si tú especificas dos veces "hola", el parser se da cuenta, porque mantiene cadenas de caracteres únicas en una tabla de símbolos. Así que realmente hacen referencia al mismo objeto. (comparable con Java String, que tb es inmutable, pero StringBuffer sí es mutable). Operaciones como '+' o '%' crean nuevas cadenas de caracteres, es decir, nuevos objetos: >>> a="Hola" >>> b="Hol" >>> c=b+"a" >>> a==c 1 >>> a is c 0 >>> a[2:3]="kk" TypeError: object doesn't support slice assignment Mientras que el parser ha hecho un buen trabajo optimizando el almacenamiento de cadenas, el intérprete no es tan listo, es decir, una vez interpretado, no se comprueba si la cadena resultante ya aparece en la tabla de símbolos. El tipo tupla también es inmutable. Una vez creada una tupla, esta no se puede modificar. >>> t=(1,2,3) >>> t[0]=0 TypeError: object doesn't support item assignment Lo mismo que se aplica a las cadenas de caracteres también vale para las tuplas. Los diccionarios y las listas son tipos mutables, es decir, su contenido puede cambiar. Se puede agregar, modificar y borrar. En a=[] [] es un constructor que devuelve una nueva instancia de tipo lista y que equivale a a=list() Lo mismo pasa con los diccionarios. Dado que están haciendo una limpia de conceptos, en Python 2.2 se ha introducido el alias 'dict' como tipo de dictionarios. d=dict() es lo mismo que d={} >>> type(d) >>> dict Así que cada vez que escribas [] o {} estás creando un objeto nuevo. Atención:!!!! pasando este tipo de estructuras por parámetro a funciones. Si la función lo modifica puedes tener consecuencias inciertas en la función llamante. Así que si quieres temporalmente modificar estas estructuras sin que la función llamante se entere: def x(): milista=[1,2,3] print "milista antes de llamar funcion y",milista y(milista) print "milista despues de llamar funcion y",milista def y(lista): lista=list(lista) # Sacar copia de lista antes de modificarlo lista.append(4) print "lista en funcion y",lista aunque como tu mencionaste lista=lista*1 o lista=lista[:] también valen, pero con dict no funciona. En dict sí existe la definición copy, pero list no la define. Quizá eso habría sido lo más explícito: d={1: 'hola'} d2=d.copy() lista=[1,2,3] lista2=lista1.copy() # No funciona, da error. Finalmente, la asignación nunca crea un objeto, sino que sólo asocia. Eso en otros lenguajes también es cierto en mayor medida. Expresiones que crean instancias de tipos conocidos en Python son {...}, [...], "...". 1,2,3, 4j, 4.2, etc. son objetos ya existentes. Saludos, Erny ----- Original Message ----- From: "Chema Cortés" To: Sent: Monday, August 19, 2002 12:24 PM Subject: [Python-es] Asignaciones e identidades > Hola a todos: > > Ya de vuelta de vacaciones, he hecho algunos deberes. > > Una de las cosas que me ha dado por estudiar es la relación entre asignaciones > e identidades. He creado el siguiente test: > > >>> a=3 > >>> b=3 > >>> a is b > 1 > > Aquí vemos que, aunque 'a' y 'b' se crean en diferentes sentencias, ambos son > el mismo objeto!!!. He repetido el test para diversos tipos de datos y he > obtenido los siguientes resultados: > > 3 true > 3L false > 3.0 false > 3j false > "" true > () true > [] false > {} false > > No he encontrado una posible explicación que explique esta diferenciación que > se hace entre tipos de datos. ¿Alguien tiene una explicación? > > > Estudiando un poco más el tema de las identidades, centrado ya en las > asignaciones de listas tenemos que, si 'L' es una lista: > > >>> s=L > >>> s is L > 1 > >>> s=L[:] > >>> s is L > 0 > >>> s==L > 1 > > Vemos que la asignación opera de dos formas distintas: > > 1) en la primera asignación se da a 's' la misma referencia que tiene 'L'. Por > así decirlo, es similar una asignación de "punteros". En C++ sería: > > ListType& s = L; > > > 2) en la segunda asignación, la expresión 'L[:]' genera una nueva lista cuya > referencia se asigna a 's'. En este caso, hay creación previa del nuevo > objeto, cuya referencia se asigna a 's'. > > ListType& s = new ListType(L); > > > El uso de operador de rebanado L[:] siempre es el que se ve como "truco" para > realizar una "copia" de una lista. Todo consiste en forzar que la asignación > se haga como en el segundo caso, para lo que se puede usar cualquier > expresión que devuelva una lista igual a la original. 'L[:]' es el caso más > visto, pero se podría utilizar otros operadores como el de replicación 'L*1' > e incluso el de añadir 'L+[]'. ¿Alguna razón que haga más aconsejable el uso > de L[:]? (Personalmente, me gusta más L*1 que L[:]). > > > Espero no haber sido demasiado "espeso" con el tema, pero era algo que tenía > aún por digerir. > > Saludos, > Chema Cortés > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > From mostroratas en yahoo.es Mon Aug 19 16:07:55 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Mon, 19 Aug 2002 16:07:55 +0200 (CEST) Subject: Asignaciones e identidades In-Reply-To: References: Message-ID: <20020819140755.16190.qmail@web20902.mail.yahoo.com> --- Hernan Martinez Foffani escribió: > ¿será por velocidad? L[:] es el "idiom" mas usado. perdon por la preguntilla, pero... que significa ese palabro? es decir, a que os referis con "idiom"? a expresion conocida o utilizada? > Saludos, > -Hernan Un saludo. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From hernan en orgmf.com.ar Mon Aug 19 16:40:57 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Mon, 19 Aug 2002 16:40:57 +0200 Subject: [Python-es] Asignaciones e identidades In-Reply-To: <20020819140755.16190.qmail@web20902.mail.yahoo.com> Message-ID: > > ¿será por velocidad? L[:] es el "idiom" mas usado. > > perdon por la preguntilla, pero... que significa ese palabro? es > decir, a que os referis con "idiom"? > a expresion conocida o utilizada? idiom == "expresion idiomatica". expresiones que tienen otro sentido que las partes individuales que las componen. en este caso, uno leería L[:] como "obtengo una copia de L" y no como "obtengo una rebanada del mismo tamaño que L" creo que con el tiempo todos los lenguajes de programación "desarrollan" expresiones idiomaticas. -H. From miguev en gulic.org Tue Aug 20 01:56:27 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Tue, 20 Aug 2002 00:56:27 +0100 Subject: win32all In-Reply-To: <000b01c24785$aa3e0950$0100a8c0@sicem.biz> References: <200208191224.41097.chemacortes@wanadoo.es> <000b01c24785$aa3e0950$0100a8c0@sicem.biz> Message-ID: <20020819235627.GA14520@Harry> ¿Sabe alguien si con el módulo win32all o alguno de su familia (win32api, etc.) se pueden crear usuarios en Windows 2000? La intención es hacer un script para crear algo así como 500 usuarios de un plumazo. Saludos y gracias :-) -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Twenty Percent of Zero is Better than Nothing. -- Walt Kelly ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From hernan en orgmf.com.ar Tue Aug 20 02:36:46 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 20 Aug 2002 02:36:46 +0200 Subject: [Python-es] win32all In-Reply-To: <20020819235627.GA14520@Harry> Message-ID: > ¿Sabe alguien si con el módulo win32all o alguno de su familia > (win32api, etc.) se pueden crear usuarios en Windows 2000? La > intención es hacer un script para crear algo así como 500 usuarios de > un plumazo. parece que si. encontre esto perdido por ahi: >>> di={} >>> di['name'] = "NombreUsuario" >>> di['password'] = "Secreta" >>> di['comment'] = "Usuario Creado por Python" >>> di['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT >>> di['priv'] = win32netcon.USER_PRIV_USER >>> win32net.NetUserAdd(None, 1, d) >>> espero que te sirva. Saludos, -Hernan From hernan en orgmf.com.ar Tue Aug 20 02:43:20 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 20 Aug 2002 02:43:20 +0200 Subject: win32all In-Reply-To: References: Message-ID: uf! debía ser: >>> win32net.NetUserAdd(None, 1, di) ^^^^^ -H. From chemacortes en wanadoo.es Tue Aug 20 09:43:30 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Tue, 20 Aug 2002 08:43:30 +0100 Subject: Uso del intern (RE: Asignaciones e identidades) Message-ID: Attila escribió: > solo se puede hacer "interning" sobre los tipos de datos > inmutables. y dentro de ellos algunos se hace automaticamente > y sobre otros no. por ejemplo, los strings se hacen interning > solo si se "parecen" a un nombre de valido en python. > > >>> a = "variable" > >>> b = "variable" > >>> a is b > 1 > >>> a = "no es variable" > >>> b = "no es variable" > >>> a is b > 0 > >>> > > el programador puede forzar el interning de strings mediante el > builting intern() Entiendo que todo se trate de una "optimización" del intérprete, aunque no llego a ver claras cuáles son las ventajas. Pero me da pie para otra pregunta que también me estaba rondando. He estado leyendo el libro "Web Programming in Python: Techniques for integrating Linux, Apache, and MySQL" de G.K.Thinruvathukal/T.W.Christopher/J.P.Shaface (donde se trata el framework "Slither" http://www.slither.info). En el capítulo de python avanzado comentan que para comparar dos cadenas es más rápido combinar 'intern()' e 'is' que el operador de comparación '==' entre cadenas. Esto es, en lugar de: # En lugar de "mi variable" == "mi var" + "riable" # más rápido intern("mi variable") is intern("mi va" + "riable") Desde luego sólo notaríamos la velocidad si tuviéramos que comparar numerosas cadenas. Entiendo, pues, que la rapidez no es otra cosa que aprovecharse de que el intérprete ya había hecho la "comparación" implícitamente cuando creó y dio la misma representación interna a las cadenas que queremos comparar. Pero sigo sin comprender porqué en el ejemplo: >>> a = "mi variable" >>> b = "mi variable" >>> a is b 0 >>> intern(a) is intern(b) 1 Si ambas cadenas comparten la misma representación interna, ¿por qué no son el mismo objeto? Supongo que para comprender mejor este asunto tendría que meterme a fondo con las estructuras de datos en el código fuente de python. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From hernan en orgmf.com.ar Tue Aug 20 11:16:38 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 20 Aug 2002 11:16:38 +0200 Subject: Uso del intern (RE: Asignaciones e identidades) In-Reply-To: References: Message-ID: Chema: > [fui yo, Hernan, no Attila ;-)]: > > el programador puede forzar el interning de strings mediante el > > builting intern() > > Entiendo que todo se trate de una "optimización" del intérprete, > aunque no llego a ver claras cuáles son las ventajas. el interning automatico (el que se activa sin llamar al builtin) lo hace el interprete en cadenas que tienen la forma "[A-Za-z_][[A-Za-z0-9_]*", o sea, cadenas que se parecen a nombres de validos en Python, y en los enteros de 0 a 99 inclusive. en los strings la optimización del intérprete es para el parser: las comparaciones de los nombres de objetos se hacen por identidad. en el caso de los enteros la optimización es en ejecución. en cuanto a la ganancia, no tengo idea. > .... En el capítulo de > python avanzado comentan que para comparar dos cadenas es más > rápido combinar 'intern()' e 'is' que el operador de comparación > '==' entre cadenas. Esto es, en lugar de: > > # En lugar de > "mi variable" == "mi var" + "riable" > > # más rápido > intern("mi variable") is intern("mi va" + "riable") > > Desde luego sólo notaríamos la velocidad si tuviéramos que > comparar numerosas cadenas. interesante.... esto no lo sabia. probablemente esta sea una de las razones por la cual se expuso intern() y no quedó solo como un detalle de implementacion del interprete. [la clase String de Java tiene tambien un metodo .intern() que hace lo mismo.] > Entiendo, pues, que la rapidez no es otra cosa que aprovecharse > de que el intérprete ya había hecho la "comparación" > implícitamente cuando creó y dio la misma representación interna > a las cadenas que queremos comparar. Pero sigo sin comprender > porqué en el ejemplo: > > >>> a = "mi variable" > >>> b = "mi variable" > >>> a is b > 0 > >>> intern(a) is intern(b) > 1 > > Si ambas cadenas comparten la misma representación interna, ¿por > qué no son el mismo objeto? en el caso "mi variable" no se hace intern automatico porque la cadena tiene un blanco en el medio. para que se "interne" hay que llamar al builtin en forma explicita. >>> x = "me voy a internar" >>> id(x) 10266200 <<-- x es un nuevo objeto >>> xi = intern(x) >>> id(xi) 10266200 <<-- el objeto x se interna >>> y = "me voy a internar" >>> id(y) 10343536 <<-- y es un nuevo objeto >>> yi = intern(y) >>> id(yi) 10266200 <<-- intern() devuelve la referencia a >>> x internado >>> id(y) 10343536 <<-- pero el nombre y sigue apuntando al >>> objeto original. intern() no puede cambiar el binding del nombre "y" del objeto original id:10343536 al objeto internado id:10266200 porque para ello tendría que modificar el espacio de nombres del que la invoco. Saludos, -Hernan From mostroratas en yahoo.es Tue Aug 20 12:29:10 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Tue, 20 Aug 2002 12:29:10 +0200 (CEST) Subject: Problema con el Yapps (por si alguien lo usa) Message-ID: <20020820102910.27691.qmail@web20910.mail.yahoo.com> buenas a todos, alguien usa el yapps? porque me lo he bajado y he puesto la opcion: parser BoolOp: option : "use-new-regexps" ya que sin ello, me da el siguiente aviso: yapps.py:32: DeprecationWarning: the regex module is deprecated; please use the re module import regex, sys en principio no hay problema y funciona, pero el problema viene al poner dicha opcion ya que pasa lo siguiente: >>> pred.parse('expr','linux & sun') Traceback (most recent call last): File "", line 1, in ? File "pred.py", line 153, in parse parser = BoolOp(BoolOpScanner(input)) File "pred.py", line 98, in __init__ ], ['"[ \\t\\n\\r]"'], str) File "pred.py", line 22, in __init__ self.patterns.append( (k, re.compile(r)) ) File "/usr/lib/python2.2/sre.py", line 178, in compile return _compile(pattern, flags) File "/usr/lib/python2.2/sre.py", line 228, in _compile raise error, v # invalid expression sre_constants.error: unbalanced parenthesis y si quito la linea de dicha opcion (en el mi gramatica) va sin problemas, es por si ya sabias algo de esto o no. por ahora puedo tirar sin esa opcion, porque funciona usando el regex, pero al estar depreciado me da cosa de lo que pueda pasar en el futuro. Gracias. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From jujibo en inicia.es Tue Aug 20 12:40:47 2002 From: jujibo en inicia.es (Julio =?iso-8859-15?q?Jim=E9nez?=) Date: Tue, 20 Aug 2002 12:40:47 +0200 Subject: [Python-es] Problema con locale Message-ID: Hola a todos. Tengo Python 2.2.1 en Debian Woody 3.0 y configuré los locales para el lenguaje castellano y que saliera el símbolo del euro. Todo funciona correctamente en los terminales, man en castellano y demás.... En python, al importar el módulo locale con >>>import locale cuando deseo consultar la configuración, me informa de un error >>> locale.getdefaultlocale() Traceback.... . . . ValueError: unknown locale: es_ES en euro y esto me imposibilita utilizar programas bajo python que utilicen el módulo locale. ¿Alguien sabe porqué no reconoce es_ES en euro, cuando Gnome y otros programa sí lo reconocen? Gracias a todos Julio Jiménez From hernan en orgmf.com.ar Tue Aug 20 15:05:10 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 20 Aug 2002 15:05:10 +0200 Subject: [Python-es] L[:] vs L*1 Message-ID: Había sugerido en respuesta a un mensaje de Chema que quizás el uso de L[:] en vez de L*1 para copiar una lista se debía a un tema de velocidad. Como es mejor medir que especular hice unas pruebas. El resultado es que L*1 es un 25% mas rapido que L[:]! El porcentaje varia pero L*1 es siempre mas rapido que L[:] en cualquier condición de tamaño de la lista, parametros de optimizacion, entorno, etc. Use python 2.2.1 en W2K y en Linux. Les mando los resultados y el programita de prueba. La pregunta de Chema de por qué L[:] es la forma mas conocida sigue en pie. -Hernan nota: la columna len(L) muestra en realidad la cuarta parte del tamaño de la lista. ------------ Windows 2000 ------------- C:>c:\python22\python lis.py len(L) count L[:] L*1 %diff 50 1000 0.009 0.007 -21 100 1000 0.015 0.012 -20 500 1000 0.072 0.058 -19 1000 1000 0.143 0.113 -20 50 10000 0.084 0.070 -16 100 10000 0.153 0.126 -17 500 10000 0.719 0.580 -19 1000 10000 1.420 1.140 -19 50 100000 0.832 0.712 -14 100 100000 1.553 1.259 -18 500 100000 7.165 5.807 -18 1000 100000 14.180 11.350 -19 C:\>c:\python22\python -OO lis.py len(L) count L[:] L*1 %diff 50 1000 0.009 0.007 -25 100 1000 0.016 0.014 -12 500 1000 0.071 0.057 -18 1000 1000 0.142 0.115 -19 50 10000 0.085 0.070 -17 100 10000 0.155 0.124 -19 500 10000 0.720 0.575 -20 1000 10000 1.428 1.146 -19 50 100000 0.841 0.717 -14 100 100000 1.568 1.335 -14 500 100000 7.155 5.761 -19 1000 100000 14.139 11.409 -19 C:\> --------- Suse 7.1 Linux 2.2.18 hernan en condor:~ > python lis.py len(L) count L[:] L*1 %diff 50 1000 0.020 0.000 -100 100 1000 0.020 0.010 -49 500 1000 0.070 0.050 -28 1000 1000 0.140 0.090 -35 50 10000 0.080 0.070 -12 100 10000 0.150 0.110 -26 500 10000 0.680 0.490 -27 1000 10000 1.350 0.960 -28 50 100000 0.890 0.690 -22 100 100000 1.540 1.140 -25 500 100000 6.890 4.930 -28 1000 100000 13.550 9.610 -29 hernan en condor:~ > python -OO lis.py len(L) count L[:] L*1 %diff 50 1000 0.010 0.010 0 100 1000 0.020 0.010 -50 500 1000 0.070 0.050 -28 1000 1000 0.130 0.110 -15 50 10000 0.090 0.080 -11 100 10000 0.150 0.120 -20 500 10000 0.710 0.490 -30 1000 10000 1.360 0.970 -28 50 100000 0.880 0.710 -19 100 100000 1.550 1.130 -27 500 100000 6.880 4.920 -28 1000 100000 13.550 9.660 -28 hernan en condor:~ > ----------- lis.py ---------------- import time print "len(L) count L[:] L*1 %diff " for count in [1000, 10000, 100000]: t8 = time.clock() for i in xrange(count): pass t9 = time.clock() tloop = t9 - t8 for length in [50, 100, 500, 1000]: L = ["1xxxxx", 5000, 40.40, ("33","44")] * length s = L t1 = time.clock() for i in xrange(count): s = L[:] t2 = time.clock() t3 = time.clock() for i in xrange(count): s = L * 1 t4 = time.clock() tslice = t2-t1 - tloop tmult1 = t4-t3 - tloop print " %4d %6d %6.3f %6.3f %3d" % \ (length, count, tslice, tmult1, \ ((tmult1-tslice)/tslice)*100) ------------------------------- From zoso en demiurgo.org Tue Aug 20 15:19:59 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Tue, 20 Aug 2002 14:19:59 +0100 Subject: Problema con locale In-Reply-To: References: Message-ID: <20020820131959.GF476@foton.es> On Tue, Aug 20, 2002 at 12:40:47PM +0200, Julio Jiménez wrote: > > Hola a todos. > > Tengo Python 2.2.1 en Debian Woody 3.0 y configuré los locales para el > lenguaje castellano y que saliera el símbolo del euro. Todo funciona > correctamente en los terminales, man en castellano y demás.... > > En python, al importar el módulo locale con > > >>>import locale > > cuando deseo consultar la configuración, me informa de un error > > >>> locale.getdefaultlocale() > > Traceback.... ¿Qué error da? ¿Cómo tienes la configuración del Python (/etc/python2.2/*)? Aquí, el Python 2.1 no me da problemas (aunque devuelve "['en_US', 'ISO8859-1']", no sé por qué). ¿Sólo casca el Python 2.2? -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From chemacortes en wanadoo.es Tue Aug 20 15:27:05 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Tue, 20 Aug 2002 14:27:05 +0100 Subject: [Python-es] Problema con locale Message-ID: > En python, al importar el módulo locale con > > >>>import locale > > cuando deseo consultar la configuración, me informa de un error > > >>> locale.getdefaultlocale() > > Traceback.... > . > . > . > ValueError: unknown locale: es_ES en euro > y esto me imposibilita utilizar programas bajo python que utilicen el módulo > locale. > > ¿Alguien sabe porqué no reconoce es_ES en euro, cuando Gnome y otros programa sí > lo reconocen? El módulo locale no incluye la codificación para el euro. Es un fallo que ya hemos comentado en alguna ocasión anterior (mira en el archivo de la lista). Está comunicado a los desarrolladores de python (http://sourceforge.net/tracker/?func=detail&atid=105470&aid=554676&group_id=5470). En esta dirección tienes un "apaño" mío para el módulo 'locale' o, más recomendable para no tener que machacar la instalación del python, un apaño del 'sitecustomize.py'. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From miguev en gulic.org Tue Aug 20 19:03:03 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Tue, 20 Aug 2002 18:03:03 +0100 Subject: win32all In-Reply-To: References: <20020819235627.GA14520@Harry> Message-ID: <20020820170303.GB6309@Harry> On Tue, Aug 20, 2002 at 02:36:46AM +0200, Hernan Martinez Foffani wrote: > > ¿Sabe alguien si con el módulo win32all o alguno de su familia > > (win32api, etc.) se pueden crear usuarios en Windows 2000? La > > intención es hacer un script para crear algo así como 500 usuarios de > > un plumazo. > > parece que si. > encontre esto perdido por ahi: > > >>> di={} > >>> di['name'] = "NombreUsuario" > >>> di['password'] = "Secreta" > >>> di['comment'] = "Usuario Creado por Python" > >>> di['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT > >>> di['priv'] = win32netcon.USER_PRIV_USER > >>> win32net.NetUserAdd(None, 1, d) > >>> > > espero que te sirva. Vaya que sí, creo que será el remedio que necesitaba. La cuestión es ¿dónde está la documentación de este módulo? Saludos y más gracias :-) -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- The fashion wears out more apparel than the man. -- William Shakespeare, "Much Ado About Nothing" ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From jujibo en inicia.es Tue Aug 20 18:16:15 2002 From: jujibo en inicia.es (Julio =?iso-8859-1?q?Jim=E9nez?=) Date: Tue, 20 Aug 2002 18:16:15 +0200 Subject: [Python-es] Problema con locale In-Reply-To: References: Message-ID: Problema resuelto. Lo he solucionado añadiendo el alias 'es_es en Euro' con la página de códigos iso8859-15, como proponías en el mensaje del sourceforge'. Aunque he modificalo 'locale.py' y esto no es lo más correcto, supongo que en una nueva revisión de Python, vendrá por defecto de esta forma. Por cierto, el fichero 'sitecustomize.py' supongo que habrá que crearlo, puesto que no lo encuentro en ningún sitio. Con respecto a la ayuda de Esteban Manchado; en Python 2.1 también reporta el mismo error. (el euro es el símbolo monetario europeo es relativamente nuevo y los desarrolladores de Python, Guido and family, supongo que no conocimiento de ello...:) Gracias por vuestra ayuda a todos. Julio Jiménez On Tuesday 20 August 2002 15:27, you wrote: > > En python, al importar el módulo locale con > > > > >>>import locale > > > > cuando deseo consultar la configuración, me informa de un error > > > > >>> locale.getdefaultlocale() > > > > Traceback.... > > . > > . > > . > > ValueError: unknown locale: es_ES en euro > > y esto me imposibilita utilizar programas bajo python que utilicen el > > módulo locale. > > > > ¿Alguien sabe porqué no reconoce es_ES en euro, cuando Gnome y otros > > programa sí lo reconocen? > > El módulo locale no incluye la codificación para el euro. Es un fallo que > ya hemos comentado en alguna ocasión anterior (mira en el archivo de la > lista). Está comunicado a los desarrolladores de python > (http://sourceforge.net/tracker/?func=detail&atid=105470&aid=554676&group_i >d=5470). En esta dirección tienes un "apaño" mío para el módulo 'locale' o, > más recomendable para no tener que machacar la instalación del python, un > apaño del 'sitecustomize.py'. > > > Saludos, From jujibo en inicia.es Tue Aug 20 18:21:02 2002 From: jujibo en inicia.es (Julio =?iso-8859-1?q?Jim=E9nez?=) Date: Tue, 20 Aug 2002 18:21:02 +0200 Subject: [Python-es] Glade Pythongenerator In-Reply-To: <20020817134219.53b022aa.pabloruiz@gnu.org> References: <20020811190552.1a422eaf.pabloruiz@gnu.org> <1029579466.2238.1.camel@renata.macondo.pri> <20020817134219.53b022aa.pabloruiz@gnu.org> Message-ID: Perdón por responder a esta pregunta tan tarde, pero creo que es de interés de todos. Con respecto al Glade, os recomiendo que visiteis: http://wxglade.sourceforge.net Es el equivalente al Glade, pero para wxPython. Aún está en false alfa pero promete. Un Saludo Julio Jiménez Borreguero On Saturday 17 August 2002 13:42, you wrote: > El 17 Aug 2002 12:17:45 +0200 > > Marcos Sánchez Provencio escribió: > > ¿En qué quedó todo esto? ¿Cuál era el problema de usar el glade? Me > > parece mucho mas pitonesco no compilar nada que no sea necesaro. > > No, no. Si yo no quería compilar nada. Pero prefería (en aras de la > multiplataformidad, olé el palabro) > tener dos .py que no un .py y un .glade que me obligará a tener libglade > en el ordenador (léase usuarios de windows, que haberlos haylos). > > Vamos, que veía más cómodo distribuir mi programa en plan python+GTK que > no python+GTK+libglade. > > Eso era todo. > > Por eso pedía ayuda para convertir mi .glade a un .py (o dos como hace > el glc.py), porque me da a mí que el glc.py lo hacía mal (lleva parado > bastante tiempo según su web). > > Saludos. > > Elfo > > > El dom, 11-08-2002 a las 19:05, Pablo Ruiz Múzquiz escribió: > > > Releyendo mensajes antiguos he encontrado uno de kmilo en donde > > > comentaba sus experiencias > > > con anjuta y glade y suspiraba porque glade no generase código > > > python directamente (igual que lo hace con perl, podría hacerlo con > > > python a través de un script). > > > > > > Yo también encontré glc.py pero no me ha funcionado nada bien (el > > > indent es erróneo y no entiende muchas clases de gnome) > > > Por lo que veo en la web, está bastante abandonado. > > > > > > ¿alguien podría convertir mi .glade a un .py decente. > > > > > > la aplicación es muy sencillita y puede encontrarse en mi web > > > http://elenya.net (sección trabajos) bajo el nombre de Biblioteca de > > > Annúminas. > > > se trata de una utilidad para gestionar fichas bibliográficas de > > > libros(en plan amateur, por supuesto). y es mi primera aplicación > > > hecha con Glade, libglade y python (aunque ya llevo usando python > > > mucho tiempo). > > > > > > Gracias > > > > > > PS: y pyQT? no soy ningún fanático de GTK, pero no parece que haya > > > algo parecido a glade con QT y libre. > > > > > > -- > > > Pablo Ruiz Múzquiz > > > pabloruiz en gnu.org :: http://elenya.net > > > --------------------------------------- > > > GPG -> http://elenya.net/pabloruiz > > > --------------------------------------- > > > _______________________________________________ > > > Python-es mailing list > > > Python-es en aditel.org > > > http://listas.aditel.org/listinfo.py/python-es > > > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es From hernan en orgmf.com.ar Tue Aug 20 19:23:28 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 20 Aug 2002 19:23:28 +0200 Subject: [Python-es] win32all In-Reply-To: <20020820170303.GB6309@Harry> Message-ID: > Vaya que sí, creo que será el remedio que necesitaba. La cuestión es > ¿dónde está la documentación de este módulo? en sourceforge estaban los fuentes de la doc para compilar y generar un archivo help. para tenerlos precompilados puedes bajarte el python de ActiveState. tambien se usa el mismo MSDN. -H. From miguev en gulic.org Wed Aug 21 01:51:00 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Wed, 21 Aug 2002 00:51:00 +0100 Subject: FileSelection en Tkinter Message-ID: <20020820235100.GA13048@Harry> Socorro, necesito alguien que domine Tkinter. Es mi primer día con este toolkit y lo más parecido que había visto era GTK+ (y se parecen como un huevo a un castaña). Necesito poner un widget en mi aplicación tal que al pulsarlo aparezca un diálogo de selección de fichero. Sé que se puede hacer en Tck/Tk pero no encuentro como hacerlo con el Tkinter de Python 2.1 Saludos. -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Sobre gustos no hay nada escrito. ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From chemacortes en wanadoo.es Wed Aug 21 09:24:51 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Wed, 21 Aug 2002 08:24:51 +0100 Subject: [Python-es] Problema con locale Message-ID: > Problema resuelto. > > Lo he solucionado añadiendo el alias 'es_es en Euro' con la página de códigos > iso8859-15, como proponías en el mensaje del sourceforge'. > > Aunque he modificalo 'locale.py' y esto no es lo más correcto, supongo que en > una nueva revisión de Python, vendrá por defecto de esta forma. > > Por cierto, el fichero 'sitecustomize.py' supongo que habrá que crearlo, > puesto que no lo encuentro en ningún sitio. Supongo que se arreglará en la nueva versión (2.3), aunque, si lo piensas bien, el problema viene por la codificación por defecto para unicodes y, en general, hay muchas otras cosas que tienen también que limar con los unicodes. El 'sitecustomize.py' tendrás que crearlo en el PYTHONPATH (recomendado en /site-packages). Cuando arranca el intérprete, se importa el módulo 'site' que, si miras el código, importa a su vez el módulo 'sitecustomize'. Este fichero sería donde configurar tu instalación de python. Si quieres que los cambios sean exclusivos para un usuario puedes utilizar la variable de entorno PYTHONSTART (mira el módulo user). Y por cierto, Guido y varios de los "padres" del python son holandeses. Supongo que aunque sólo sea en vacaciones tendrán e usar alguna vez Euros :-)) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From jujibo en inicia.es Wed Aug 21 10:00:43 2002 From: jujibo en inicia.es (Julio =?iso-8859-15?q?Jim=E9nez?=) Date: Wed, 21 Aug 2002 10:00:43 +0200 Subject: FileSelection en Tkinter In-Reply-To: <20020820235100.GA13048@Harry> References: <20020820235100.GA13048@Harry> Message-ID: Hola. Programar en Tkinter es bastante sencillo, pero debes conocer antes algunos fundamentos básicos, que sereía largo de explicar en un mensaje. Hay bastante documentación en castellano sobre Tkinter con buenos ejemplos, también puedes revisar los ejemplos que vienen y ver cómo funcionan. (hay ejemplos de lo que pides) Si vas a programas con Tkinter, re recomiento que utilices Pmw (Python Mega Widgets, que es una librería de componentes bastante buena, bienen componentes para la introducción de fechas, números de distintos tipos...) La dirección es: http://pmw.sourceforge.net/ También hay otros GUI para desarrollar en python, como wxPython, PyQt, FxPy, todos ellos son bastante buenos y tienen sus pros y contras. (Yo he desarrollado en todos, pero al final me quedé con wxPython por diversos motivos). Un Saludo Julio Jiménez On Wednesday 21 August 2002 01:51, you wrote: > Socorro, necesito alguien que domine Tkinter. Es mi primer día con > este toolkit y lo más parecido que había visto era GTK+ (y se parecen > como un huevo a un castaña). Necesito poner un widget en mi aplicación > tal que al pulsarlo aparezca un diálogo de selección de fichero. Sé > que se puede hacer en Tck/Tk pero no encuentro como hacerlo con el > Tkinter de Python 2.1 > > Saludos. From hernan en orgmf.com.ar Wed Aug 21 10:11:38 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Wed, 21 Aug 2002 10:11:38 +0200 Subject: [Python-es] FileSelection en Tkinter In-Reply-To: <20020820235100.GA13048@Harry> Message-ID: > ............. Necesito poner un widget en mi aplicación > tal que al pulsarlo aparezca un diálogo de selección de fichero. Sé > que se puede hacer en Tck/Tk pero no encuentro como hacerlo con el > Tkinter de Python 2.1 import tkFileDialog print tkFileDialog.Open().show() Saludos, -Hernan From jujibo en inicia.es Wed Aug 21 10:17:16 2002 From: jujibo en inicia.es (Julio =?iso-8859-1?q?Jim=E9nez?=) Date: Wed, 21 Aug 2002 10:17:16 +0200 Subject: Problema con locale In-Reply-To: References: Message-ID: Tienes razón, en cuanto a lo de Guido (un pequeño fallo al confundirlo con Robin Dunn - wxPython que es de Portland....) En cuanto a la raíz del problema, también pienso que se debe a la mala planificación en el manejo de los unicodes (no se han esforzado mucho en ello - si no que alguien que no haya modificado nada en Python, que intente grabar un caracter con tilde, una eñe o algo parecido en el entorno IDLE.) >>> UnicodeError: ASCII encoding error: ordinal not in range(128) Olvidé que tuve que añadir una orden en un fichero (en otro equipo)que creo que era el que comentamos para que el binomio Python-Idle pudiese grabar ficheros con estos caracteres, es decir que manejase caracteres unicode. Un Saludo Julio Jiménez On Wednesday 21 August 2002 09:24, you wrote: > > Problema resuelto. > > > > Lo he solucionado añadiendo el alias 'es_es en Euro' con la página de > > códigos iso8859-15, como proponías en el mensaje del sourceforge'. > > > > Aunque he modificalo 'locale.py' y esto no es lo más correcto, supongo > > que en una nueva revisión de Python, vendrá por defecto de esta forma. > > > > Por cierto, el fichero 'sitecustomize.py' supongo que habrá que crearlo, > > puesto que no lo encuentro en ningún sitio. > > Supongo que se arreglará en la nueva versión (2.3), aunque, si lo piensas > bien, el problema viene por la codificación por defecto para unicodes y, en > general, hay muchas otras cosas que tienen también que limar con los > unicodes. > > El 'sitecustomize.py' tendrás que crearlo en el PYTHONPATH (recomendado en > /site-packages). Cuando arranca el intérprete, se importa el > módulo 'site' que, si miras el código, importa a su vez el módulo > 'sitecustomize'. Este fichero sería donde configurar tu instalación de > python. Si quieres que los cambios sean exclusivos para un usuario puedes > utilizar la variable de entorno PYTHONSTART (mira el módulo user). > > Y por cierto, Guido y varios de los "padres" del python son holandeses. > Supongo que aunque sólo sea en vacaciones tendrán e usar alguna vez Euros > :-)) > > > Saludos, From chemacortes en wanadoo.es Wed Aug 21 10:58:35 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Wed, 21 Aug 2002 09:58:35 +0100 Subject: [Python-es] RE: Uso del intern (Parte 2) Message-ID: Hernan dijo(sorry por el error en el mensaje anterior O:-)= > el interning automatico (el que se activa sin llamar al builtin) > lo hace el interprete en cadenas que tienen la forma > "[A-Za-z_][[A-Za-z0-9_]*", o sea, cadenas que se parecen a > nombres de validos en Python, y en los enteros de 0 a 99 inclusive. > > en los strings la optimización del intérprete es para el parser: > las comparaciones de los nombres de objetos se hacen por > identidad. en el caso de los enteros la optimización es en > ejecución. > en cuanto a la ganancia, no tengo idea. Tal como "amenazé", me entro la locura y me metí con el código C del python. Lo primero que he observado es lo cuidadosos que son por controlar los malloc/free de memoria. Existe gran cantidad de código para depurar cualquier fallo que exista con fallos con la memoria. Para evitar el realizar frecuentes llamadas a malloc/free que pudieran fragmentar la memoria, en las creaciones de objetos se puede reservar espacio (normalmente 1024 bytes) como buffer para almacenar unos cuantos objetos. A este buffer pueden ir a parar los que se usan más frecuentemente. Así tenemos que: - enteros: se consideran que los enteros más frecuentes son desde el -1 al 99. Siempre que creemos un 'int' de este rango nos devolverá la misma referencia. - reales (float): se reserva un buffer de 1024 bytes para objetos float, aunque no se comprueba antes de crearse el objeto si ya existía el mismo número en el buffer. Puedo suponer que para cálculo numérico intensivo se podría mejorar el rendimiento de python aumentando este buffer y recompilando. - strings y unicodes: se "cachea" la cadena vacía "" y las cadenas de longitud de un caracter (más adelante comento un poco lo del 'intern') - tuplas: sólo se "cachea" la tupla vacía (). Es curiosa la optimización que han usado aquí. Las tuplas de tamaño comprendido entre 0 y 20 comparten la misma estructura en memoria, variando tan sólo el valor que tiene cada una. Con las tuplas sólo obtemos la misma referencia cuando se trata con la tupla vacía: >>> a=(1,) >>> b=(1,) >>> a is b 0 >>> a=() >>> b=() >>> a is b 1 En cuanto a explicar lo de la "internalización automática" de strings tan sólo he comprobado que no se hace durante la creación del objeto string. Por lo tanto debe ser una consecuencia del "parser" y de cómo crea éste la tabla de símbolos que comparte con el compilador de bytecode. Parece ser que el parser que considerar a las cadenas simples como si fueran un símbolo más: >>> a="Hola" >>> a is intern("Hola") 1 >>> b="Hola y adiós" >>> b is intern("Hola y adiós") 0 Quién sabe si en algún momento se le pasó por la cabeza a alguien que en python fuera válido hacer algo tal que así: >>> $"MiVar"=1 Lo anterior no existe en python (todavía), pero algo similar sí que se puede ver en php: $var="MiVar" $$var=1 ((En python se usaría para esto el 'eval')) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From mostroratas en yahoo.es Wed Aug 21 12:23:54 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Wed, 21 Aug 2002 12:23:54 +0200 (CEST) Subject: analizador con el yapps (solucion casi completa) In-Reply-To: <20020801164219.GE684@demiurgo.org> References: <20020801164219.GE684@demiurgo.org> Message-ID: <20020821102354.70914.qmail@web20901.mail.yahoo.com> --- Esteban Manchado Velázquez escribió: > Si ya sabes de gramáticas va a ser trivial implementar el analizador para > esas expresiones. Ten en cuenta que necesitarías, probablemente, cinco > terminales («and», «or», «paréntesis abierto», «paréntesis cerrado», > «literal») y una gramática *muy* simplona para resolver eso. Luego pones los > trocitos de Python donde haga falta para manejar los casos y listo. > > ¡Ánimo! :-) pues nada, envio el mail para contaros como ha salido todo, estoy contento pq ya sale casi todo (a ver si consigo que vaya todo, pero...) al final use el yapps para resolver mi problemilla y despues de trastear un poco, me ha quedado una gramatica de la forma: -----------pred.g------------------------------------- parser BoolOp: option : "context-insensitive-scanner" ignore : "[ \t\n\r]" token END: "\\'" token TERM: '[a-zA-Z][a-zA-Z_0-9]*' token AND: "&" token OR: "|" token NOT: "!" rule expr: pred END -> << pred >> rule pred: TERM pred_rest<> -> << pred_rest >> | NOT pred -> << 'Not'+"("+pred+")">> | "(" pred ")" par_rest<> -> << par_rest >> rule pred_rest<>: -> << 'Terminal'+"('"+pred1+"')" >> | opbool pred -> << opbool+"("+'Terminal'+"('"+pred1+"')"+","+pred+")">> rule opbool: AND -> << 'And' >> | OR -> << 'Or' >> rule par_rest<>: -> << pred2 >> | opbool pred -> << opbool+"("+pred2+","+pred+")">> ------------------------------------------------------------------------- asi que luego genero el modulo python con el yapps y hago una purbecillas con los parentesis anidados o en distintos formatos y va bien :) >>> pred.parse('expr','linux & pc') "And(Terminal('linux'),Terminal('pc'))" >>> pred.parse('expr','linux & pc4') "And(Terminal('linux'),Terminal('pc4'))" >>> pred.parse('expr','2linux & pc4') <---- no deberia ir por empezar por numero Bad Token on line 1: > 2linux & pc4 > ^ List of nearby tokens: >>> pred.parse('expr','linux|(sun&(!pc))') "Or(Terminal('linux'),And(Terminal('sun'),Not(Terminal('pc'))))" >>> pred.parse('expr','(www|http)&!bsd') "And(Or(Terminal('www'),Terminal('http')),Not(Terminal('bsd')))" >>> pred.parse('expr','linux') "Terminal('linux')" >>> Asi que ya digo digo que funciona con parentesis anidados y con parentesis antes y o despues de otras cosas. Con eso ya funciona :) Ahor ya solo falta para hacerlo mas completo que tambien pudiera reconocer los tokens 'and, 'or' y 'not' ademas de los simbolos (y poder escribir algo como: 'linux and sun') y esto no lo he conseguido aun, no se muy bien por que, intenta asignarlo a un terminal en vez con un operador booleano :( obviamente no es la misma gramatica, esta prueba es para ver si reconoce esos caracteres en vez de los simbolos: token AND: "and" token OR: "or" token NOT: "not" >>> predl.parse('expr','linux and www') Could not match pred_rest on line 1: > linux and www > ^ List of nearby tokens: (@0) TERM = 'linux' (@6) TERM = 'and' >>> bueno, si a alguno le interesa, cuando lo consiga os lo mando. Un saludo y por cierto, a veces me desborda ver de las cosas de las cosas de las que hablais y que no tengo ni idea ni de que son, pero en el fondo me gusta intentar entender el codigo o del tema, al menos veo que hay montones de cosas en python, para hacer de, casi todo o todo? :) Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From miguev en gulic.org Wed Aug 21 12:19:43 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Wed, 21 Aug 2002 11:19:43 +0100 Subject: [Python-es] FileSelection en Tkinter In-Reply-To: References: <20020820235100.GA13048@Harry> Message-ID: <20020821101943.GA3771@Harry> Umm, gracias por toda esa información, interesante :-) De momento el Tkinter lo uso sólo para que sea fácil de instalar en ruindoze, ya que es ahí donde se usará, pero puedo desarrollar casi todo en mi querido Linux 0:-) Para lo demás me quedo con GTK+/Gnome/libglade, pero tengo que probar wxPython. ¿Qué constructor de GUIs recomiendas, wxglade o boa? On Wed, Aug 21, 2002 at 10:00:43AM +0200, Julio Jiménez wrote: > Hola. > > Programar en Tkinter es bastante sencillo, pero debes conocer antes algunos > fundamentos básicos, que sereía largo de explicar en un mensaje. > > Hay bastante documentación en castellano sobre Tkinter con buenos ejemplos, > también puedes revisar los ejemplos que vienen y ver cómo funcionan. (hay > ejemplos de lo que pides) > > Si vas a programas con Tkinter, re recomiento que utilices Pmw (Python Mega > Widgets, que es una librería de componentes bastante buena, bienen > componentes para la introducción de fechas, números de distintos tipos...) > > La dirección es: http://pmw.sourceforge.net/ > > También hay otros GUI para desarrollar en python, como wxPython, PyQt, FxPy, > todos ellos son bastante buenos y tienen sus pros y contras. (Yo he > desarrollado en todos, pero al final me quedé con wxPython por diversos > motivos). > > Un Saludo > > Julio Jiménez > > > > On Wednesday 21 August 2002 01:51, you wrote: > > Socorro, necesito alguien que domine Tkinter. Es mi primer día con > > este toolkit y lo más parecido que había visto era GTK+ (y se parecen > > como un huevo a un castaña). Necesito poner un widget en mi aplicación > > tal que al pulsarlo aparezca un diálogo de selección de fichero. Sé > > que se puede hacer en Tck/Tk pero no encuentro como hacerlo con el > > Tkinter de Python 2.1 > > > > Saludos. > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Even if you persuade me, you won't persuade me. -- Aristophanes ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From miguev en gulic.org Wed Aug 21 12:20:38 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Wed, 21 Aug 2002 11:20:38 +0100 Subject: [Python-es] FileSelection en Tkinter In-Reply-To: References: <20020820235100.GA13048@Harry> Message-ID: <20020821102038.GB3771@Harry> On Wed, Aug 21, 2002 at 10:11:38AM +0200, Hernan Martinez Foffani wrote: > > ............. Necesito poner un widget en mi aplicación > > tal que al pulsarlo aparezca un diálogo de selección de fichero. Sé > > que se puede hacer en Tck/Tk pero no encuentro como hacerlo con el > > Tkinter de Python 2.1 > > import tkFileDialog > print tkFileDialog.Open().show() Cómo te lo diría... "eres mi salvación"... te debo ya unas cuantas :-) -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- El futuro es de los que creen en la belleza de sus sueños. -- Eleanor Roosevel. ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From jujibo en inicia.es Wed Aug 21 13:14:58 2002 From: jujibo en inicia.es (Julio =?iso-8859-15?q?Jim=E9nez?=) Date: Wed, 21 Aug 2002 13:14:58 +0200 Subject: [Python-es] FileSelection en Tkinter In-Reply-To: <20020821101943.GA3771@Harry> References: <20020820235100.GA13048@Harry> <20020821101943.GA3771@Harry> Message-ID: Una pregunta bastante comprometida... :) Ambos proyectos están aún un poquito verdes, de los dos tendrías que bajarte las versiones del CVS. Si eres nuevo en wxPython te recomiendo que ejecutes la demo y consultes su código fuente (viene cada demo por separado) ahí aprenderás bastante. BOA: Es un entorno integrado al estilo Delphi de Borland, con depurador integrado, generador de docs, auto ident, completado de código, ayuda en linea, Zope... y un montón de cosas. TiEs muy rápido empezar a trabajar con él, pero como te he comentado aún le falta mucho. (como editor no está mal y funciona en Linux y Windows). A mi gusto, el código generado deja mucho que desear... :> wxGlade: Un entorno para la creación de formularios al estilo del clásico Glade (en casi todo). Crear un formulario con él es bastante sencillo. Le quedan por añadir muchos componentes, pero la verdad para estar en fase alfa es muy operativo. Yo me he puesto en contacto con su desarrollador para hacerle unas recomendaciones que creo básica... Curiosamente cuando creas campos que pueden contener el foco, el último en el formulario es el primero con capturar el foco y se va desplazando de componente en componente en orden inverso, esto es debido a la forma en la recorre el árbol XML para generar el código... (no comprendo como nadie se había dado cuenta... es lo primero que ví). También le indiqué la necesidad de añadir la propiedad TabOrder a los objetos que pueden contener el foco, de forma que sea controlable. wxGlade te permite incluso crear clases heredadas y te genera el código. Para finalizar, mi recomendación es que descargues los dos y los pruebes tú mismo para experimentar con ellos... y si tienes algún problema, no dudes en preguntar. Julio Jiménez On Wednesday 21 August 2002 12:19, you wrote: > Umm, gracias por toda esa información, interesante :-) > > De momento el Tkinter lo uso sólo para que sea fácil de instalar en > ruindoze, ya que es ahí donde se usará, pero puedo desarrollar casi > todo en mi querido Linux 0:-) > > Para lo demás me quedo con GTK+/Gnome/libglade, pero tengo que probar > wxPython. ¿Qué constructor de GUIs recomiendas, wxglade o boa? > From chemacortes en wanadoo.es Wed Aug 21 13:39:28 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Wed, 21 Aug 2002 12:39:28 +0100 Subject: [Python-es] analizador con el yapps (solucion casi completa) Message-ID: > al final use el yapps para resolver mi problemilla y despues de trastear un poco, me ha quedado > una gramatica de la forma: > > -----------pred.g------------------------------------- > > parser BoolOp: > option : "context-insensitive-scanner" > ignore : "[ \t\n\r]" > token END: "\\'" > token TERM: '[a-zA-Z][a-zA-Z_0-9]*' > token AND: "&" > token OR: "|" > token NOT: "!" No tengo mucha idea, pero tu problema con los ANDs/ORs/NOTs te viene por cumplirse antes la regla TERM (con lo que "and", "or" y "not" se considerarán como tokens). Cambia el orden y ya dirás si funciona. > Un saludo y por cierto, a veces me desborda ver de las cosas de las cosas de las que hablais y que > no tengo ni idea ni de que son, pero en el fondo me gusta intentar entender el codigo o del tema, > al menos veo que hay montones de cosas en python, para hacer de, casi todo o todo? :) Si lo dices por todo el rollo del "intern", también te puedo decir que en cambio yo no tengo casi ni idea de lo que estás preguntando. Pero al menos conozco a alguien por aquí al que se le puede preguntar si algún día me hiciera falta ;-) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From mostroratas en yahoo.es Wed Aug 21 20:09:39 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Wed, 21 Aug 2002 20:09:39 +0200 (CEST) Subject: analizador con el yapps (solucion completa gracias a Chema ;D) In-Reply-To: References: Message-ID: <20020821180939.10617.qmail@web20908.mail.yahoo.com> --- Chema Cortes escribió: > No tengo mucha idea, pero tu problema con los ANDs/ORs/NOTs te viene por cumplirse antes la > regla TERM (con lo que "and", "or" y "not" se considerarán como tokens). Cambia el orden y ya > dirás si funciona. Joder, pues para no tener mucha idea, has dicho lo mas logico y claro, funciona y yo probando chorradas, no hay nada como pensar logicamente o leerse bien la doc, claro que con el calor y el ingles a veces alguno ya no se entera :) Pues nada, ya funciona del todo, gracias Chema, asi que ha quedado asi (solo he cambiado lo del ppio que decia Chema y he aniadido los dos variantes): parser BoolOp: option : "context-insensitive-scanner" ignore : "[ \t\n\r]" token END: "\\'" token AND: "and\\|&" token OR: "or\\||" token NOT: "not\\|!" token TERM: '[a-zA-Z][a-zA-Z_0-9]*' y va como un fenomeno el chavalin :D aqui teneis unos ejemplitos de lo mismo escrito de las dos formas y con el mismo resultado: >>> predc.parse('expr','linux & ! www') "And(Terminal('linux'),Not(Terminal('www')))" >>> predc.parse('expr','linux and not www') "And(Terminal('linux'),Not(Terminal('www')))" >>> predc.parse('expr','linux or (sun and (not www))') "Or(Terminal('linux'),And(Terminal('sun'),Not(Terminal('www'))))" >>> predc.parse('expr','linux|(sun&(!www))') "Or(Terminal('linux'),And(Terminal('sun'),Not(Terminal('www'))))" >>> predc.parse('expr','(sun&(!www))&pc') "And(And(Terminal('sun'),Not(Terminal('www'))),Terminal('pc'))" >>> predc.parse('expr','(sun and(not www))and pc') "And(And(Terminal('sun'),Not(Terminal('www'))),Terminal('pc'))" >>> predc.parse('expr','(sun and(! www))& pc') "And(And(Terminal('sun'),Not(Terminal('www'))),Terminal('pc'))" >>> ademas claro, como en el ultimo, se pueden combinar :) > Si lo dices por todo el rollo del "intern", también te puedo decir que en cambio yo no tengo > casi ni idea de lo que estás preguntando. Pero al menos conozco a alguien por aquí al que se le > puede preguntar si algún día me hiciera falta ;-) NO, lo del intern lo veo y lo entiendo, las cosas de compiladores y aprovechamiento o posiciones de memoria es algo que comprendo, al menos hay algo ;) no, para mi, las ciencias ocultas es lo de TKinter, Glade, Boa y demas cosas de GUI o aplicaciones varias, y ya cuando juntais tres, lo flipo, como se podra juntar todo eso a la vez. Que yo solo tengo el linux instalado en plan usuario para las practicas de la escuela y pq siempre me digo que un dia quiero trastear a fondo, pero nunca lo hago, asi que obviamente, muchos de esos nombres y acronimos me suenan muy extranios :( > Saludos, Tb. saludos y gracias :) > Chema Cortes (chemacortes en wanadoo.es) Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From zoso en demiurgo.org Wed Aug 21 23:57:20 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Wed, 21 Aug 2002 22:57:20 +0100 Subject: [Python-es] analizador con el yapps (solucion completa gracias a Chema ;D) In-Reply-To: <20020821180939.10617.qmail@web20908.mail.yahoo.com> References: <20020821180939.10617.qmail@web20908.mail.yahoo.com> Message-ID: <20020821215720.GB1116@demiurgo.org> On Wed, Aug 21, 2002 at 08:09:39PM +0200, Attila Saorin wrote: > [...] > >>> predc.parse('expr','(sun and(! www))& pc') > "And(And(Terminal('sun'),Not(Terminal('www'))),Terminal('pc'))" > >>> > > ademas claro, como en el ultimo, se pueden combinar :) Ahora podrías sobrarte escribiendo baterías de pruebas, si tienes interés. La documentación es bastante buena y son fáciles de escribir. El paquete se llama «unittest» y tiene documentación en http://www.python.org/doc/current/lib/module-unittest.html Seguro que hay un montón de gente que ha escrito documentos adicionales para enseñar a usarlo, pero probablemente tendrás suficiente con la documentación de referencia. No, hombre, que no te quiero dar más trabajo, es sólo por si tienes curiosidad y quieres aprender... ;-) Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From toomany en toomanyhq.homeunix.net Thu Aug 22 11:06:50 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Thu, 22 Aug 2002 11:06:50 +0200 Subject: [Python-es] Filosofeando (no flame, por favor) Message-ID: <200208221106.50965.toomany@toomanyhq.homeunix.net> Buenas. Me gustaría mucho que, aunque os pueda resultar difícil, me seais lo máximamente imparciales que podais, por favor, ante esta pregunta: Alguien que haya usado (bastante) tanto python como perl, ¿podría hacerme una lista con "fundamento" de los pros y contras? Muchas gracias. Y repito, por favor, aunque lo pueda poner en bandeja, que no se cree ningún flame. Si es necesario, contestadme a mi dirección de correo directamente. -- Have a nice day ;-) TooManySecrets From amaya en debian.org Thu Aug 22 12:50:47 2002 From: amaya en debian.org (Amaya) Date: Thu, 22 Aug 2002 12:50:47 +0200 Subject: [Python-es] Duda un poco =?iso-8859-1?Q?b=E1sica_=BFRT?= =?iso-8859-1?B?Rk0/?= ;-) Message-ID: <20020822105047.GA29740@aenima> Muy buenas a todos/as. En el trabajo acaban de declarar a Python acomo lenguage oficial de scripting del departamento de sistemas, lo cual me llena de gozo por un lado, porque me gusta mucho, y me aterra un poco por otro, porque no ando muy suelta. Estoy considerando adquirir "Learning Python", porque no soy la única por aquí que programa de oído ;-) [Metáfora musical]. ¿Alguno tiene una sugerencia mejor? Bueno, al grano.. Estoy parseando unos logs de iptables. Mi programa (de momento) es este: #!/usr/bin/python import re, string file = open('amaya', 'r') line_num = 0 i,j = 0, i+ 1 my_file = [] for line in file.readlines(): line_num = line_num + 1 row_elem = string.split(line) date1 = row_elem[0] + " " + row_elem[1] date2 = row_elem[2] match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') pattern = match_pat.search(line) src_addr = pattern.group(1) dst_addr = pattern.group(2) src_port = pattern.group(4) dst_port = pattern.group(5) sequence = pattern.group(6) ack_seq = pattern.group(7) param = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq] my_file.insert (line_num, param) file.close() while i < line_num: while j < len(param): print my_file[i] El error es este: [arodrigo en cuelebre iptables]$ python amaya.py Traceback (most recent call last): File "amaya.py", line 28, in ? print my_file[line_num ] IndexError: list index out of range Yo lo único que quiero es tener una tabla de este estilo: ------------------------------------- | line_num = 1 | dato1 | dato2 | ... | ------------------------------------- | line_num = 2 | dato1 | dato2 | ... | ------------------------------------- | ... | dato1 | dato2 | ... | ------------------------------------- | line_num = n | dato1 | dato2 | ... | ------------------------------------- y poder recorrerla con algo así como hacía en C o PHP: my_file[0,1] pero no doy con cómo hacerlo. No sé si se me entiende. :-( Gracias y un saludo! Amaya -- Revolutions don't require corporate support From chemacortes en wanadoo.es Thu Aug 22 12:46:41 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Thu, 22 Aug 2002 11:46:41 +0100 Subject: Filosofeando (no flame, por favor) Message-ID: Puedo hablarte de las diferencias entre python y perl, pero me cuesta decirte qué características son pros o contras. Depende mucho del uso que les des y, sobre todo, de tus gustos personales. En mi humilde opinión destacaría: - perl: - pros - muy apropiado para manipulado de textos (scripts del sistema, CGI,...) - el CPAN, gigantesca fuente de recursos que ahorra mucho trabajo - gran madurez, que lo hace elegible para grandes proyectos, casi siempre combinado con el lenguaje C - contras - difícil legibidad: variables implícitas, streams implícitos, sintáxis casi dactilográfica,... (hay quien diría que esto son "pros" y no "contras") - orientación a objetos muy penosa - excasa implantación en entornos gráficos y de multimedia - la licencia artística del perl - python - pros - sintaxis sencilla y de fácil legibilidad ("explícita") - combinación de lenguaje no declarativo, orientación a objetos, y programación funcional (seguramente haya quien no vea en ello una ventaja) - incorpora entorno de comandos y editor gráfico (IDLE) - apropiado para cualquier tipo de desarrollo, incorporando por defecto la librería gráfica tkinter. - multiplataforma: pvm, jython, .NET, pippy, .... La multiplataforma está formando parte del lenguaje (unicodes, módulo os, ...) - metaprogramación (inspección del entorno de ejecución, control del parser y compilador, desensamblador de bytecodes,...) - pydoc: sistema completo de ayuda, documentación automática de código, etc. - Mejoras contínuas del lenguaje a través de propuestas (PEPs) que aseguran compatibilidad con versiones anteriores. - Aunque de soslayo, destacaría entre los "pros" la existencia de algunos módulos como Numeric para cálculo numérico, ó los que existen para CGIs y XML. En perl hay cosas similares, pero no es lo mismo. - licencia python compatible con GPL - contra - falta de madurez. Todavía no es el lenguaje elegido para proyectos importantes. Con la versión 2.3 se espera dar tiempo suficiente para que madure. De momento no se me ocurren más. Destacaría que la tendencia actual con el desarrollo de "parrot" para perl 6 y python 3000 es dotar a ambos de las mismas características "multiplataforma". PD: Advierto que nunca he usado el perl para nada importante, y que mis opiniones son claramente "pro-python". Saludos, Chema _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From hernan en orgmf.com.ar Thu Aug 22 13:11:18 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 22 Aug 2002 13:11:18 +0200 Subject: =?iso-8859-1?Q?RE:_=5BPython-es=5D_Duda_un_poco_b=E1sica_=BFRTFM=3F_;-=29?= In-Reply-To: <20020822105047.GA29740@aenima> References: <20020822105047.GA29740@aenima> Message-ID: > En el trabajo acaban de declarar a Python acomo lenguage oficial > de scripting > del departamento de sistemas, lo cual me llena de gozo por un > lado, porque me > gusta mucho, y me aterra un poco por otro, porque no ando muy suelta. ¡que buena decision la de tu empresa! :-D > Estoy considerando adquirir "Learning Python", porque no soy la > única por aquí > que programa de oído ;-) [Metáfora musical]. ¿Alguno tiene una > sugerencia mejor? el libro ese está bien. ¿el tutorial no te alcanza? por la regexp que escribiste no pareces que seas "nuevita" en programación, no? (el tutorial puede ser algo duro para los que nunca programaron.) > Bueno, al grano.. > Estoy parseando unos logs de iptables. Mi programa (de momento) es este: > > #!/usr/bin/python > import re, string > file = open('amaya', 'r') no uses "file" como nombre de variable, en la versión 2.2 es un tipo de datos nuevo. > i,j = 0, i+ 1 ¿como funcionó esto? ¡¡¡te debió dar error!!!! i en la rhs no está definida todavia. > my_file = [] > for line in file.readlines(): en la 2.2 y siguientes: fil = file('amaya', 'r') for line in fil: ... etc ... > .... > param = [line_num, date1, date2, src_addr, dst_addr, > src_port, dst_port, sequence, ack_seq] > my_file.insert (line_num, param) ¿no sería mas sencillo: my_file.append(param) ? > while i < line_num: > while j < len(param): > print my_file[i] mmm... aquí no estás incrementando i (ni j). > y poder recorrerla con algo así como hacía en C o PHP: > my_file[0,1] pero no doy con cómo hacerlo. si my_file fuera una lista de listas, sería: my_file[0][1] -Hernan From zoso en demiurgo.org Thu Aug 22 13:16:55 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Thu, 22 Aug 2002 12:16:55 +0100 Subject: Filosofeando (no flame, por favor) In-Reply-To: <200208221106.50965.toomany@toomanyhq.homeunix.net> References: <200208221106.50965.toomany@toomanyhq.homeunix.net> Message-ID: <20020822111654.GA1852@foton.es> On Thu, Aug 22, 2002 at 11:06:50AM +0200, TooManySecrets wrote: > Buenas. > > Me gustaría mucho que, aunque os pueda resultar difícil, me seais lo > máximamente imparciales que podais, por favor, ante esta pregunta: > Alguien que haya usado (bastante) tanto python como perl, ¿podría hacerme una > lista con "fundamento" de los pros y contras? > > Muchas gracias. Y repito, por favor, aunque lo pueda poner en bandeja, que no > se cree ningún flame. > Si es necesario, contestadme a mi dirección de correo directamente. Perl es mejor. JAAAJAJAJAJAJAA... Lo siento, no pude resistir decir esto en una lista de Python :-) Ahora en serio: no soy ningún experto en uno ni en otro, pero en mi opinión, Python es *mucho* más fácil de aprender, tiene un tratamiento mucho más avanzado de las clases y los objetos, que probablemente lo hace más adecuado para proyectos grandes, y tiene algunas características (muy) útiles, como las excepciones. También es bastante más ligero que Perl, por lo que está disponible en pequeños procesadores (que yo sepa, Perl no). Respecto a Perl, tiene *muchos* más módulos, más utilidades y ayudas externas (más programas entenderán la sintaxis de Perl, más aplicaciones se podrán extender con Perl [esto es algo discutible, porque en eso Python está pegando fuerte], etc.), es bastante más cómodo de escribir para hacer programas pequeños (por parámetros implícitos, atajos, operador ternario, etc.), el manejo de texto está *mucho* más avanzado que el de Python, e.m.m.o. (lo siento, no soporto la sintaxis de «re.compile...», me parece ortopédica :-) ). También me parece que, en general, es más rápido (sobre todo en texto; en manejo de objetos, Perl es *ridículamente* lento). Hay comparaciones en http://www.bagley.org/~doug/shootout/ . ¡Ah! y sobre la respuesta de Chema, que acabo de leer, creo sinceramente que está mucho mejor el POD de Perl que el Pydoc (quizás sea la costumbre, aunque tampoco he usado tanto el POD). De hecho, estoy intentando buscar un equivalente pero no lo encuentro :-) Saludos, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow From chemacortes en wanadoo.es Thu Aug 22 13:23:37 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Thu, 22 Aug 2002 12:23:37 +0100 Subject: [Python-es] =?iso-8859-1?q?Re=3A=5BPython=2Des=5D_Duda_un_poco_b=E1sica_=BFRTFM=3F_?= =?iso-8859-1?q?=3B=2D=29?= Message-ID: > Muy buenas a todos/as. > > En el trabajo acaban de declarar a Python acomo lenguage oficial de scripting > del departamento de sistemas, lo cual me llena de gozo por un lado, porque me > gusta mucho, y me aterra un poco por otro, porque no ando muy suelta. Es una grata noticia. Yo estoy intentando lo mismo en mi trabajo, pero antes tengo que erradicar el analfabetismo funcional de algunos jefes. > Estoy considerando adquirir "Learning Python", porque no soy la única por aquí > que programa de oído ;-) [Metáfora musical]. ¿Alguno tiene una sugerencia mejor? No hay mucho donde recomendarte. El "Learning Python" está bien como una referencia, pero mi consejo es que utilizes la documentación propia de python, y hacer llamadas al "pydoc" (función help en modo shell). Un libro del que he sacado muy buenas ideas es el que comenté hace unos días "Web programming in python: techniques for integrating linux, apache and mysql". Ya no puedo prometer nada por los contínuos retrasos que llevo, pero estoy preparando un curso de python ("pytando") que espero dejar listos los primeros capítulos un día de estos. > Bueno, al grano.. > Estoy parseando unos logs de iptables. Mi programa (de momento) es este: He mirado el código, y creo que está incompleto: > #!/usr/bin/python > import re, string > file = open('amaya', 'r') No es un fallo grave, pero te aconsejo que uses 'file()' en lugar de 'open()' para que quede claro que estás inicializando un objeto 'file', y que tampoco uses 'file' como variable. > line_num = 0 > i,j = 0, i+ 1 ¿Cuánto vale inicialmente 'i'? > my_file = [] > for line in file.readlines(): > line_num = line_num + 1 > row_elem = string.split(line) > date1 = row_elem[0] + " " + row_elem[1] > date2 = row_elem[2] > match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') > pattern = match_pat.search(line) > src_addr = pattern.group(1) > dst_addr = pattern.group(2) > src_port = pattern.group(4) > dst_port = pattern.group(5) > sequence = pattern.group(6) > ack_seq = pattern.group(7) > param = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq] > my_file.insert (line_num, param) Aquí insert intenta insertar el elemento 'param' en la posición 'line_num'. Tal como está el código, no hay tantos elementos en 'my_file', con lo que siempre se añade al final de la lista. Hubiera sido mejor haber utilizado el append: my_file.append(param) > file.close() > > while i < line_num: > while j < len(param): > print my_file[i] No veo que se incremente ni 'i' ni 'j' > El error es este: > > [arodrigo en cuelebre iptables]$ python amaya.py > Traceback (most recent call last): > File "amaya.py", line 28, in ? > print my_file[line_num ] > IndexError: list index out of range Me falta esta línea. > Yo lo único que quiero es tener una tabla de este estilo: > > ------------------------------------- > | line_num = 1 | dato1 | dato2 | ... | > ------------------------------------- > | line_num = 2 | dato1 | dato2 | ... | > ------------------------------------- > | ... | dato1 | dato2 | ... | > ------------------------------------- > | line_num = n | dato1 | dato2 | ... | > ------------------------------------- > > y poder recorrerla con algo así como hacía en C o PHP: my_file[0,1] pero no doy > con cómo hacerlo. Utiliza: my_file[0][1] (como en C) Para imprimir, aprovéchate del trabajo hecho: from pprint import pprint pprint(my_file) Si pones el código completo podríamos darte más indicaciones. Y sobre todo, insiste, que no será tiempo malempleado. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From amaya en debian.org Thu Aug 22 13:57:04 2002 From: amaya en debian.org (Amaya) Date: Thu, 22 Aug 2002 13:57:04 +0200 Subject: =?iso-8859-1?Q?=5BPyth?= =?iso-8859-1?Q?on-es=5D_Duda_un_poco_b=E1sica_=BFRTFM=3F?= ;-) In-Reply-To: References: <20020822105047.GA29740@aenima> Message-ID: <20020822115704.GC29740@aenima> Hernan Martinez Foffani dijo: > ¡que buena decision la de tu empresa! :-D Sí, el día que además se pasen a Debian será el sitio ideal para trabajar :-))) > ¿el tutorial no te alcanza? por la regexp que escribiste no pareces que seas > "nuevita" en programación, no? (el tutorial puede ser algo duro para los que > nunca programaron.) No, el tutorial me parece excelente, pero me siento como si dieran algo por sabido, mira el tipo de preguntas que hago :-) Respecto a mi experiencia programando... me considero bastante mediocre :-) Soy de letras, autodidacta, y además no tengo mucha experiencia. > no uses "file" como nombre de variable, en la versión 2.2 es un tipo de datos > nuevo. Gracias, lo rectifico. > ¿como funcionó esto? ¡¡¡te debió dar error!!!! Cierto, copié una versión mala del script ;-) > i en la rhs no está definida todavia. ¿Qué es rhs? > ¿no sería mas sencillo: my_file.append(param) ? Seguramente. A eso me refiero cuando digo que me considero bastante mediocre. A que tiro 10 líneas para cosas que se pueden hacer en una... Pero estoy empeñada a aprender python como sea :-) > mmm... aquí no estás incrementando i (ni j). Yap. > si my_file fuera una lista de listas, sería: > my_file[0][1] ¿Y esto está en el tutorial? Debo andar ciega total :-) Gracias. El script queda así: #!/usr/bin/python import re, string my_file = open('amaya', 'r') line_num = 0 #i = 0 #j = i + 1 i = j = 0 my_log = [] for line in my_file: line_num = line_num + 1 row_elem = string.split(line) date1 = row_elem[0] + " " + row_elem[1] date2 = row_elem[2] match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') pattern = match_pat.search(line) src_addr = pattern.group(1) dst_addr = pattern.group(2) src_port = pattern.group(4) dst_port = pattern.group(5) sequence = pattern.group(6) ack_seq = pattern.group(7) param = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq] # my_log.insert (line_num, param) my_log.append(param) my_file.close() while i < line_num: print my_log[i] # while j < len(param): # print my_log[i][j] # j = j + 1 # i = i + 1 i = i + 1 Ahora me imprime esto: [arodrigo en cuelebre iptables]$ python amaya.py [1, 'Aug 22', '09:35:23', 'SRC=192.168.3.9', 'DST=192.168.3.11', 'SPT=37192', 'DPT=80', 'SEQ=1899023795', 'ACK=0'] [2, 'Aug 22', '09:35:23', 'SRC=192.168.3.9', 'DST=192.168.3.12', 'SPT=37193', 'DPT=80', 'SEQ=1906765896', 'ACK=0'] [3, 'Aug 22', '09:35:33', 'SRC=192.168.3.9', 'DST=192.168.3.11', 'SPT=37194', 'DPT=80', 'SEQ=1915899003', 'ACK=0'] [4, 'Aug 22', '09:35:33', 'SRC=192.168.3.9', 'DST=192.168.3.12', 'SPT=37195', 'DPT=80', 'SEQ=1911844646', 'ACK=0'] Y estoy encantada :-)) Pero si descomento y "arreglo" el último while: while i < line_num: while j < len(param): print my_log[i][j] j = j + 1 i = i + 1 Entonces se me queja: [arodrigo en cuelebre iptables]$ python amaya.py 1 Aug 22 09:35:33 SRC=192.168.3.9 Traceback (most recent call last): File "amaya.py", line 32, in ? print my_log[i][j] IndexError: list index out of range Me imagino que i o j se están dando un viaje, pero... ¿a dónde? Si en cambio pruebo esto (porque programo de oído ;-)))): while i < line_num: while j < len(param): print my_log[i][j] j = j + 1 i = i + 1 Me imprime esto: [arodrigo en cuelebre iptables]$ python amaya.py 1 Aug 22 09:35:23 SRC=192.168.3.9 DST=192.168.3.11 SPT=37192 DPT=80 SEQ=1899023795 ACK=0 Pero sólo la primera línea... ¿? Otra cosa, ¿No existe algo como i++ y j++ para incrementar un contador? Gracias de nuevo. -- Revolutions don't require corporate support From chemacortes en wanadoo.es Thu Aug 22 14:26:21 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Thu, 22 Aug 2002 13:26:21 +0100 Subject: [Python-es] =?iso-8859-1?q?Re=3A_=5BPython=2Des=5D_RE=3A_=5BPython=2Des=5D_Duda_un_?= =?iso-8859-1?q?poco_b=E1sica_=BFRTFM=3F_=3B=2D=29?= Message-ID: > Hernan Martinez Foffani dijo: > > si my_file fuera una lista de listas, sería: > > my_file[0][1] > > ¿Y esto está en el tutorial? Debo andar ciega total :-) Al final de la sección 3.1.4, aunque casi no se ve. > El script queda así: > > #!/usr/bin/python > import re, string > my_file = open('amaya', 'r') > line_num = 0 > #i = 0 > #j = i + 1 > > i = j = 0 > > my_log = [] > for line in my_file: > line_num = line_num + 1 > row_elem = string.split(line) Por comentar un poco, el módulo string ya se está dejando de usar. Puedes emplear mejor los métodos del objeto: row_elem = line.split() > date1 = row_elem[0] + " " + row_elem[1] > date2 = row_elem[2] > match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') > pattern = match_pat.search(line) > src_addr = pattern.group(1) > dst_addr = pattern.group(2) > src_port = pattern.group(4) > dst_port = pattern.group(5) > sequence = pattern.group(6) > ack_seq = pattern.group(7) > param = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq] > # my_log.insert (line_num, param) > my_log.append(param) > my_file.close() > > while i < line_num: > print my_log[i] > # while j < len(param): > # print my_log[i][j] > # j = j + 1 > # i = i + 1 > i = i + 1 Queda más elegante de esta forma: for line in my_log: print line > Pero si descomento y "arreglo" el último while: > > while i < line_num: > while j < len(param): > print my_log[i][j] > j = j + 1 > i = i + 1 > > Entonces se me queja: Tienes que identar correctamente el incremento de 'i' > Si en cambio pruebo esto (porque programo de oído ;-)))): > > while i < line_num: > while j < len(param): > print my_log[i][j] > j = j + 1 > i = i + 1 > > Me imprime esto: > [arodrigo en cuelebre iptables]$ python amaya.py > 1 > Aug 22 > 09:35:23 > SRC=192.168.3.9 > DST=192.168.3.11 > SPT=37192 > DPT=80 > SEQ=1899023795 > ACK=0 Aquí tenías bien identado 'i', pero deberías haber vuelto a poner 'j' a cero antes de empezar el segundo bucle. i=0 while i < line_num: j=0 while j < len(param): print my_log[i][j] j = j + 1 i = i + 1 Pero como mejor sería: for line in my_log: for elem in line: print elem Te evitarías todos los líos de usar índices. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From hernan en orgmf.com.ar Thu Aug 22 14:28:00 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 22 Aug 2002 14:28:00 +0200 Subject: =?iso-8859-1?Q?RE:_=5BPython-es=5D_RE:_=5BPython-es=5D_Duda_un_poco_b?= =?iso-8859-1?Q?=E1sica_=BFRTFM=3F_;-=29?= In-Reply-To: <20020822115704.GC29740@aenima> References: <20020822115704.GC29740@aenima> Message-ID: > No, el tutorial me parece excelente, pero me siento como si > dieran algo por sabido, mira el tipo de preguntas que hago :-) el tutorial está escrito asumiendo que el lector ya tiene experiencia previa en programación. > Respecto a mi experiencia programando... me considero bastante > mediocre :-) > Soy de letras, autodidacta, y además no tengo mucha experiencia. ¿mediocre? ¿programando con regexp? tenes baja tu autoestima! :-D > > i en la rhs no está definida todavia. > > ¿Qué es rhs? ups. perdon. rhs es "right hand side" y se refiere a la parte derecha de una expresion. en: a = b + c la rhs es "b + c" y la lhs (left hand side) es "a" vas a encontrar esas abreviaturas en casi cualquier manual de referencia de lenguajes de programacion. > > ¿no sería mas sencillo: my_file.append(param) ? > > Seguramente. A eso me refiero cuando digo que me considero > bastante mediocre. eh! eso no ser mediocre! > A que tiro 10 líneas para cosas que se pueden hacer en una... > Pero estoy empeñada a aprender python como sea :-) muy bien! > > si my_file fuera una lista de listas, sería: > > my_file[0][1] > > ¿Y esto está en el tutorial? Debo andar ciega total :-) je... nunca dije que estuviera en el tutorial ;-) > Pero si descomento y "arreglo" el último while: > > while i < line_num: > while j < len(param): > print my_log[i][j] > j = j + 1 > i = i + 1 > > Entonces se me queja: > > [arodrigo en cuelebre iptables]$ python amaya.py > 1 > Aug 22 > 09:35:33 > SRC=192.168.3.9 > Traceback (most recent call last): > File "amaya.py", line 32, in ? > print my_log[i][j] > IndexError: list index out of range > > Me imagino que i o j se están dando un viaje, pero... ¿a dónde? Python, a diferencia de C, no deja que se vayan muy lejos. :-D en este caso i queda en 4 > Si en cambio pruebo esto (porque programo de oído ;-)))): > > while i < line_num: > while j < len(param): > print my_log[i][j] > j = j + 1 > i = i + 1 el oido te funciono bien. :-D solo te falto poner en 0 a j para cada vuelta de i. (sospecho que para cuando leas este mail ya lo habras solucionado) > Otra cosa, ¿No existe algo como i++ y j++ para incrementar un contador? i += 1 que, en el caso de enteros, es exactamente lo mismo que escribir i = i + 1 Saludos, -Hernan From chemacortes en wanadoo.es Thu Aug 22 15:16:39 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Thu, 22 Aug 2002 14:16:39 +0100 Subject: =?iso-8859-1?q?Re=3A_=5BPython=2Des=5D_RE=3A_=5BPython=2Des=5D_Duda_un_?= =?iso-8859-1?q?poco_b=E1sica_=BFRTFM=3F_=3B=2D=29?= Message-ID: Ahora que he visto un poco más el código, veo que compilas innecesariamente la expresión regular dentro del bucle: > #!/usr/bin/python > import re, string > my_file = open('amaya', 'r') > line_num = 0 > #i = 0 > #j = i + 1 > > i = j = 0 > > my_log = [] > for line in my_file: > line_num = line_num + 1 > row_elem = string.split(line) > date1 = row_elem[0] + " " + row_elem[1] > date2 = row_elem[2] > match_pat = re.compile(r'(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') No es necesario que esté aquí. Sácala fuera del bucle. Si compilas es para ganar tiempo. También podrías incluir las fechas dentro de la expresión regular, usando '\s' para los espacios en blanco que separan palabras. > pattern = match_pat.search(line) > src_addr = pattern.group(1) > dst_addr = pattern.group(2) > src_port = pattern.group(4) > dst_port = pattern.group(5) > sequence = pattern.group(6) > ack_seq = pattern.group(7) > param = [line_num, date1, date2, src_addr, dst_addr, src_port, dst_port, sequence, ack_seq] También puedes evitar leer grupo a grupo. Mira el siguiente código: match_pat = re.compile(r'(\S+\s\S+)\s(\S+)\s(SRC=[0-9.]+)[\t ](DST=[0-9.]+)[\t ](.*TCP|UDP)[\t ](SPT=[0-9]+)[\t ](DPT=[0-9]+)[\t ](SEQ=[0-9]+)[\t ](ACK=[0-9]+)') for line in my_file: pattern = match_pat.search(line) my_log.append(pattern.groups()) ¿Más sencillo, no? Además tiene la ventaja de que puedes cambiar los grupos de la expresión regular, y seguiría funcionando. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From aerd en retemail.es Thu Aug 22 19:50:17 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Thu, 22 Aug 2002 19:50:17 +0200 Subject: =?iso-8859-1?Q?Representaci=F3n_de_asociaciones_en_bases_de_datos?= Message-ID: <001901c24a04$777adb20$0100a8c0@sicem.biz> Hola de nuevo, al ver la manera de persistir las asociaciones (incluídas agregación y composición) se me ocurren 2 posibilidades para crear el diseño de las tablas para RDBMS. Suponed que sólo tenemos relaciones de 0..1:* y 1:* (siendo *, 1..* ó 0..*), ya que una relación de n:m puede descomponerse en dos relaciones, 0..1:n y 0..1:m, podemos 1. incluir la clave de objeto en la parte muchos, (tipo poner el código del albarán en las líneas de albarán, o el código de Equipo de Trabajo al Empleado). 2. Crear una tabla de relación de objetos ('RelObjs') con las columnas OID1, OID2, CDG.Asociación. Lo que significa que el objetos con OID 1 está relacionado con OID 2 por el motivo que indica la asociación (Persona 1 está relacionada con Albarán 10, por ser cliente). Las consecuencias son: para 1. No hay tabla de objetos que podría crecer mucho. El acceso es más directo. Cada vez que a alguién se ocurre cambiar una cardinalidad de 1 ó 0..1 a más de o aparece una nueva asociación, hay que rediseñar el esquema de la base de datos. para 2. Cada vez que tengamos que acceder a los atributos de una clase asociada (Albaran.Cliente.Nombre) hay que pasar por la tabla intermedia RelObjs para posteriormente cargar el otro objeto (ralentiza). Los cambios de cardinalidad, así como modificación de asociaciones (agregación, borrados y otros) no afectan de ninguna manera el esquema de la base de datos. Se podrían agregar asociaciones dinámicamente. ¿Qué pensáis es más importante, velocidad o flexibidad del esquema de base de datos (¿reduce mantenimiento?)? No sé todavía en qué factor va a ralentizar. Intentaremos implementar los dos esquemas y hacer comparaciones. Saludos, Erny From aerd en retemail.es Thu Aug 22 19:50:43 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Thu, 22 Aug 2002 19:50:43 +0200 Subject: =?iso-8859-1?Q?Evoluci=F3n_din=E1mica_de_los_objetos_a_diferentes_clases?= References: Message-ID: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> Hola, no tiene que ver directamente con Python, más bien con programación orientado a objeto. Suponed que hay una clase Persona y otras dos clases que heredan de allí, Cliente y Proveedor. 1. ¿Cómo puede modelarse que un objeto 'evoluciona' de un la a otro, por ejemplo, Persona evoluciona a ser Cliente. ¿se puede cambiar la clase de un objeto dinámicamente? (ya sé que se puede borrar y crear un objeto nuevo de la otra clase, ¿hay otra manera?) 2. ¿Cómo podría hacerse que un objeto Cliente evolucionase a una clase Proveedor? (Es decir, una clase que no está en la rama de la clase actual del árbol de herencia.) 3. He visto alguna vez algo como esto: C.__bases__.append(D) # siendo C clase y D clase Aunque no resuelva el tema de 1. y 2., me parecía interesante, poder enriquecer la funcionalidad de una clase, agregandole clases bases. Respecto a 1. y 2. hemos llegado a la conclusión modelarlo de otra manera: crear clases Persona, DatosCliente y DatosProveedor, y hacer que Persona tenga una referencia opcional a cada uno. Si una persona nos compra algo y no tiene parte de cliente, esta es creada y asociada. Preguntar si un persona es cliente coincide con mirar si tiene una parte de datos de cliente. ¿Por qué me importa eso? Por el tema de la persistencia. El tema de dejar evolucionar dinámicamente a los objetos, me crea ciertos trastornos a la hora de las actualizaciones. Saludos, Erny From rapto en arrakis.es Thu Aug 22 21:14:56 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 22 Aug 2002 21:14:56 +0200 Subject: =?ISO-8859-1?Q?Evoluci=F3n?= =?ISO-8859-1?Q?_din=E1mica?= de los objetos a diferentes clases In-Reply-To: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> Message-ID: <1030043696.1157.44.camel@renata.macondo.pri> En cosas sencillas, he probado y vale con meterle el __class__ a pelo. Había que probarlo :-D class a: def x(self): return 'a' class b: def x(self): return 'b' aa=a() print aa.x() aa.__class__=b print aa.x() Habría que tener cuidado con las variables de objeto (no de clase). Vamos, si a tiene un atributo nn y b no lo tiene, habría que asignárselo al ascenderlo. Diabólicamente dinámico. El jue, 22-08-2002 a las 19:50, Ernesto Revilla escribió: > Hola, > > no tiene que ver directamente con Python, más bien con programación > orientado a objeto. > > Suponed que hay una clase Persona y otras dos clases que heredan de allí, > Cliente y Proveedor. > > 1. ¿Cómo puede modelarse que un objeto 'evoluciona' de un la a otro, por > ejemplo, Persona evoluciona a ser Cliente. > ¿se puede cambiar la clase de un objeto dinámicamente? > (ya sé que se puede borrar y crear un objeto nuevo de la otra clase, ¿hay > otra manera?) > > 2. ¿Cómo podría hacerse que un objeto Cliente evolucionase a una clase > Proveedor? (Es decir, una clase que no está en la rama de la clase actual > del árbol de herencia.) > > 3. He visto alguna vez algo como esto: > C.__bases__.append(D) # siendo C clase y D clase > > Aunque no resuelva el tema de 1. y 2., me parecía interesante, poder > enriquecer la funcionalidad de una clase, agregandole clases bases. > > Respecto a 1. y 2. hemos llegado a la conclusión modelarlo de otra manera: > crear clases Persona, DatosCliente y DatosProveedor, y hacer que Persona > tenga una referencia opcional a cada uno. Si una persona nos compra algo y > no tiene parte de cliente, esta es creada y asociada. Preguntar si un > persona es cliente coincide con mirar si tiene una parte de datos de > cliente. > > ¿Por qué me importa eso? Por el tema de la persistencia. El tema de dejar > evolucionar dinámicamente a los objetos, me crea ciertos trastornos a la > hora de las actualizaciones. > > Saludos, > Erny > > > > > > > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From aloy en ctv.es Thu Aug 22 21:46:24 2002 From: aloy en ctv.es (Antoni Aloy =?iso-8859-1?q?L=F3pez?=) Date: Thu, 22 Aug 2002 21:46:24 +0200 Subject: =?iso-8859-1?q?Evoluci=F3n=20din=E1mica=20de=20los=20objetos=20a?= =?iso-8859-1?q?=20diferentes?= clases In-Reply-To: <1030043696.1157.44.camel@renata.macondo.pri> References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> <1030043696.1157.44.camel@renata.macondo.pri> Message-ID: <200208222146.24922.aloy@ctv.es> El Jue 22 Ago 2002 21:14, Marcos Sánchez Provencio escrigué: > En cosas sencillas, he probado y vale con meterle el __class__ a pelo. > Había que probarlo :-D > > class a: > def x(self): > return 'a' > > class b: > def x(self): > return 'b' > > aa=a() > print aa.x() > aa.__class__=b > print aa.x() > Muy bonito, e imposible de mantener :( Depende mucho de tu aplicación, pero yo estoy por hacer algo menos genérico y más sencillo de leer/depurar/modificar, que al fin y al cabo representa un 80% del ciclo de vida de un programa. Tanto la clase cliente como proveedor pueden heredar directamente de persona, la clase básica. La persistencia se podría sobreescribir cada vez, o separarla en varios procedimientos para poder reaprovechar mejor el código. Seguir la norma KISS suele ser lo mejor en estos casos, puedes encontrar soluciones técnicamente espectaculares, pero la simplicidad del código es una virtud en sí misma. -- Antoni Aloy López Binissalem - Mallorca Linux Registered User # 210825 Gentoo Powered From hernan en orgmf.com.ar Thu Aug 22 21:49:04 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 22 Aug 2002 21:49:04 +0200 Subject: =?iso-8859-1?Q?RE:_=5BPython-es=5DRepresentaci=F3n_de_asociaciones_en_bas?= =?iso-8859-1?Q?es_de_datos?= In-Reply-To: <001901c24a04$777adb20$0100a8c0@sicem.biz> References: <001901c24a04$777adb20$0100a8c0@sicem.biz> Message-ID: una ventaja de la opción 1 es que la representacion de la base de datos queda MUY parecida a una normalizacion estandar. y eso puede ser util para acceder a la base de datos relacional directamente, o para que un sistema de terceros que no sea OO acceda al repositorio o también para que un sistema que use tu interfaz pueda acceder a un repositorio ya existente en 3ra forma normal. en la opcion 2 se haría complicadísimo usar el query language del motor para realizar consultas. a algunos esto les parecerá una ventaja ;-) es muy dificil pronosticar performance. en la opcion 2, OID1 y OID2 seguramente serán claves numéricas, no creo que tengas problemas por alli. por otro lado la tabla RelObjs puede ser un cuello de botella en actualizaciones multiusuarios/multitareas. pero son especulaciones. como bien dices, quizás lo mejor es probar las dos. en cuanto a mantenimiento... lo que sí te puedo asegurar es que si cada atributo del modelo de objetos es una tabla, el administrador no lo va a tener facil ;-) otra alternativa es (aprovechando que tenés pensado implementar las dos opciones) darle al programador la posibilidad de elegir si quiere o no "congelar" el diseño de la clase. yendo a mi preferencia personal, si el repositorio de datos requiere administración (por ejemplo si estuvieran en Oracle) prefiero "ver" y manipular comodamente los datos. je... debe ser que estoy curado de espanto. si el repositorio no requiere administración, en ese caso prefiero ni enterarme :-D saludos, -Hernan From aerd en retemail.es Thu Aug 22 23:28:06 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Thu, 22 Aug 2002 23:28:06 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DEvoluci=F3n_din=E1mica_de_los_objetos_a?= =?iso-8859-1?Q?_diferentes_clases?= References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz><1030043696.1157.44.camel@renata.macondo.pri> <200208222146.24922.aloy@ctv.es> Message-ID: <001d01c24a26$ccb93e20$0100a8c0@sicem.biz> Buenas, > Depende mucho de tu aplicación, pero yo estoy por hacer algo menos genérico y > más sencillo de leer/depurar/modificar, que al fin y al cabo representa un > 80% del ciclo de vida de un programa. > > Tanto la clase cliente como proveedor pueden heredar directamente de persona, > la clase básica. La persistencia se podría sobreescribir cada vez, o > separarla en varios procedimientos para poder reaprovechar mejor el código. Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? ¿Qué pasa si una persona es a la vez cliente y proveedor? Ya conozco la solución antigua: crear dos instancias, una como cliente y otra como proveedor, pero la verdad es que no me gusta nada. > Seguir la norma KISS suele ser lo mejor en estos casos, puedes encontrar > soluciones técnicamente espectaculares, pero la simplicidad del código es una > virtud en sí misma. Por supuesto estoy buscando soluciones simples, pero es un problema de los lenguajes y la concepción en la orientación a objetos. Si un animal tipo gusano (con todas sus propiedades) se convierte en mariposa (con unas propiedades totalmente diferentes, pero siendo el mismo animal) ¿Cómo se come esto? (La verdad es que no me gusta comer ninguno de los dos. :-( ) Erny From aerd en retemail.es Thu Aug 22 23:56:37 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Thu, 22 Aug 2002 23:56:37 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DRE:_=5BPython-es=5DRepresentaci=F3n?= =?iso-8859-1?Q?_de_asociaciones_en_bases_de_datos?= References: Message-ID: <001e01c24a26$ce0f7f50$0100a8c0@sicem.biz> > una ventaja de la opción 1 es que la representacion de la base de datos > queda MUY parecida a una normalizacion estandar. y eso puede ser util > para acceder a la base de datos relacional directamente, o para que un > sistema de terceros que no sea OO acceda al repositorio o también para > que un sistema que use tu interfaz pueda acceder a un repositorio ya > existente en 3ra forma normal. Eso es cierto, con una diferencia importante: La referencias a objetos de otra tabla, tienen que ser compuestos, por clase-instancia, por la herencia. Supon que existe una asociación entre albarán y persona con rol 'cliente', entonces existirá en la tabla Albarán un campo 'cliente'. Pero no puedo hacer que este apunte solamente a la tabla Persona, porque podría haber una clase y por tanto una tabla 'Empleado' y que el campo de la tabla en Albarán debería permitir referencias a ambas tablas (Persona y Empleado), con lo que en algunos casos no es tan fácil hacer Joins por tema de mantenimiento. Pero buscaré remedios. > en la opcion 2 se haría complicadísimo usar el query language del > motor para realizar consultas. a algunos esto les parecerá una > ventaja ;-) Lo complica un poco más, pero no es trágico. Los mismos problemas que arriba. Lo que quizá sí interese es incluir el identificador de clase siempre como parte del identificador de objeto en las llaves primarias de las tablas, para que estos Join coincidan en el campo completo (aunque el identificador de objeto esté implícito en la tabla, por lo cual es redundante). Pero siempre que se busquen todos los registros habrá que hacer consultas sobre la rama concreta (en este caso, todo el subárbol a partir de Persona). Quizá sea más fácil hacerlo desde Python, supon pm es instancia de PersistentManager ya en ejecución, a través de una consola de administración: trans=pm.newTransaction() p=Persona(nombre='Fernando',apellidos='Perez Perez') trans.addObject(p) resultado=trans.retrieveObjects \ ("SELECT p FROM Persona p WHERE p.apellidos LIKE 'Perez Perez%') for obj in resultado: obj.hermanos.add(p) trans.commit() Realiza las búsquedas tanto en Persona como en Empleado. Espero que llegue ser igual de simple o más que usar el SQL a secas: SELECT linea.albaran FROM LineaArticulo linea WHERE linea.articulo.proveedor.nombre='Perez Perez' Como ves nos quitamos unos cuantos joins del medio. > es muy dificil pronosticar performance. en la opcion 2, OID1 y OID2 > seguramente serán claves numéricas, no creo que tengas problemas por > alli. por otro lado la tabla RelObjs puede ser un cuello de botella > en actualizaciones multiusuarios/multitareas. pero son especulaciones. > como bien dices, quizás lo mejor es probar las dos. Cierto. > en cuanto a mantenimiento... lo que sí te puedo asegurar es que si > cada atributo del modelo de objetos es una tabla, el administrador > no lo va a tener facil ;-) Cada clase va a ser una tabla, no cada atributo. > otra alternativa es (aprovechando que tenés pensado implementar las > dos opciones) darle al programador la posibilidad de elegir si > quiere o no "congelar" el diseño de la clase. ¿Qué es congelar el diseño? ¿Mantener el diseño actual? He pensado en ello. Inicialmente no lo haremos porque estamos construyendo la capa para aplicaciones nuevas, pero puede ser que si alguien nos pide montar una aplicación sobre un esquema existente, que tratemos el modelo tal cual como es, inhabiltando en este caso la herencia. > yendo a mi preferencia personal, si el repositorio de datos requiere > administración (por ejemplo si estuvieran en Oracle) prefiero "ver" > y manipular comodamente los datos. je... debe ser que estoy curado > de espanto. > si el repositorio no requiere administración, en ese caso prefiero > ni enterarme :-D Entiendo. Como antes expuesto, preferiría ofrecer una terminal de administración. Habrá SQL Passthru, es decir, se podrán ejecutar directamente sentencias SQL. Erny From aloy en ctv.es Fri Aug 23 01:12:33 2002 From: aloy en ctv.es (Antoni Aloy =?iso-8859-1?q?L=F3pez?=) Date: Fri, 23 Aug 2002 01:12:33 +0200 Subject: =?iso-8859-1?q?=5BPython-es=5D Re=3A=20=5BPython-es=5DEvoluci=F3n?= =?iso-8859-1?q?=20din=E1mica=20de=20los=20objetos=20a=20diferentes?= =?iso-8859-1?q?=20clases?= In-Reply-To: <001d01c24a26$ccb93e20$0100a8c0@sicem.biz> References: <200208222146.24922.aloy@ctv.es> <001d01c24a26$ccb93e20$0100a8c0@sicem.biz> Message-ID: <200208230112.33077.aloy@ctv.es> El Jue 22 Ago 2002 23:28, Ernesto Revilla escrigué: > Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? > ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? > ¿Qué pasa si una persona es a la vez cliente y proveedor? Ya conozco la > solución antigua: crear dos instancias, una como cliente y otra como > proveedor, pero la verdad es que no me gusta nada. Se me ocurre que podríamos utilizar el concepto der rol, es decir, no considerar cliente o proveedor como una clase sino únicamente considerar la clase persona con una propiedad llamada role que puede contener una lista de los posibles casos de uso en los que puede encontrarse. Esto podría implementarse como un diccionario de objetos para poder interrogar mejor a la clase persona. Tendría que desarrollarlo un poco más, pero tiene toda la pinta de poder funcionar... Saludos, -- Antoni Aloy López Binissalem - Mallorca Linux Registered User # 210825 Gentoo Powered From rapto en arrakis.es Fri Aug 23 10:12:29 2002 From: rapto en arrakis.es (rapto) Date: Fri, 23 Aug 2002 08:12:29 GMT Subject: =?iso-8859-1?Q?Re=3A_=5BPython-es=5DEvoluci=F3n_din=E1mica_de_los_objetos_a?= =?iso-8859-1?Q?_diferentes_clases?= Message-ID: <1de3b24b2a.24b2a1de3b@page.melange.net> Bueno, más sencillo y legible, imposible. No me parece una filigrana técnica, tampoco. Si me hablas de que es una locura cambiar de clase un objeto, lo que es 'ilegible' es el diseño de la aplicación, no la solución técnica. En Python, que un objeto sea de una clase u otra no debe depender más que de su atributo __class__, lo que es bastante pitónico. De todos modos, entiendo que la migración de clase será entre clases similares, de 'apunte no contabilizado' a 'apunte contaabilizado' y cosas así. En resumidas cuentas, me parece como el asunto de la declaración de tipos (un poco a lo bestia, eso lo admito, pero debe ser porque me quedan prejuicios de cuando programaba en VB). Saludos ----- Mensaje Original ----- Remitente: Antoni Aloy López Fecha: Jueves, Agosto 22, 2002 9:46 pm Asunto: Re: [Python-es]Evolución dinámica de los objetos a diferentes clases > El Jue 22 Ago 2002 21:14, Marcos Sánchez Provencio escrigué: > > En cosas sencillas, he probado y vale con meterle el __class__ a > pelo.> Había que probarlo :-D > > > > class a: > > def x(self): > > return 'a' > > > > class b: > > def x(self): > > return 'b' > > > > aa=a() > > print aa.x() > > aa.__class__=b > > print aa.x() > > > > Muy bonito, e imposible de mantener :( > > Depende mucho de tu aplicación, pero yo estoy por hacer algo menos > genérico y > más sencillo de leer/depurar/modificar, que al fin y al cabo > representa un > 80% del ciclo de vida de un programa. > > Tanto la clase cliente como proveedor pueden heredar directamente > de persona, > la clase básica. La persistencia se podría sobreescribir cada vez, > o > separarla en varios procedimientos para poder reaprovechar mejor > el código. > > Seguir la norma KISS suele ser lo mejor en estos casos, puedes > encontrar > soluciones técnicamente espectaculares, pero la simplicidad del > código es una > virtud en sí misma. > -- > > Antoni Aloy López > Binissalem - Mallorca > Linux Registered User # 210825 > Gentoo Powered > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > From toomany en toomanyhq.homeunix.net Fri Aug 23 10:31:38 2002 From: toomany en toomanyhq.homeunix.net (TooManySecrets) Date: Fri, 23 Aug 2002 10:31:38 +0200 Subject: con o sin "=?iso-8859-1?q?caf=E9-threads?=" ;) Message-ID: <200208231031.38547.toomany@toomanyhq.homeunix.net> Buenas. Quisiera saber si me puede perjudicar en algún tema o cosa, el compilar el python (versión 2.2.1) SIN threads. Quisiera instalar el mod-python para el apache, pero debo compilar primero el python con la opción --without-threads. Y claro, debido a mi "pardillez" con el python, no tengo muy claro si me va a perjudicar en algún posible aspecto (nótese que estoy aprendiendo a desarrollar con él). Gracias. -- Have a nice day ;-) TooManySecrets From julian.albo.garcia en xunta.es Fri Aug 23 11:03:20 2002 From: julian.albo.garcia en xunta.es (julian.albo.garcia en xunta.es) Date: Fri, 23 Aug 2002 11:03:20 +0200 Subject: [Python-es] [Python-es] Re: [Python-es] =?iso-8859-1?Q?Evoluci=F3n_din=E1mica_de_los_objetos_a_diferentes_clases?= Message-ID: > Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? > ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? > ¿Qué pasa si una persona es a la vez cliente y proveedor? Ya conozco > la solución antigua: crear dos instancias, una como cliente y otra como > proveedor, pero la verdad es que no me gusta nada. Crea una clase persona, una clase cliente y una clase proveedor. Cliente y proveedor contendrán una referencia a la persona (podemos entenderlo como "titular de la cuenta"), Salu2 From hernan en orgmf.com.ar Fri Aug 23 11:42:24 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 23 Aug 2002 11:42:24 +0200 Subject: =?iso-8859-1?Q?RE:_Representaci=F3n_de_asociaciones_en_bases_de_datos?= In-Reply-To: <001e01c24a26$ce0f7f50$0100a8c0@sicem.biz> References: <001e01c24a26$ce0f7f50$0100a8c0@sicem.biz> Message-ID: > > en cuanto a mantenimiento... lo que sí te puedo asegurar es que si > > cada atributo del modelo de objetos es una tabla, el administrador > > no lo va a tener facil ;-) > Cada clase va a ser una tabla, no cada atributo. ah... ok. esto cambia las cosas, no habia entendido bien la idea. por lo que veo vas a seguir el esquema tradicional de Objetct/Relational. quizás este paper te puede ser util: http://www.objectarchitects.de/ObjectArchitects/papers/Published/ZippedPaper s/mappings04.pdf tiene varias referencias a otro papers que tambien te pueden servir. > > otra alternativa es (aprovechando que tenés pensado implementar las > > dos opciones) darle al programador la posibilidad de elegir si > > quiere o no "congelar" el diseño de la clase. > ¿Qué es congelar el diseño? ¿Mantener el diseño actual? He > pensado en ello. Inicialmente no lo haremos porque estamos construyendo > la capa para aplicaciones nuevas, pero puede ser que si alguien nos > pide montar una aplicación sobre un esquema existente, que tratemos el > modelo tal cual como es, inhabiltando en este caso la herencia. me refería a que una vez congelado no permitir luego la modificacion *dinamica* de la estructura de clases. algo como: >>> C.__bases__ = (D,) Traceback (most recent call last): File "", line 1, in ? C.__bases__ = (D,) TypeError: __bases__ is frozen. >>> esto no impide que se pueda crear una subclase de C mas tarde. también puedes hacer uso de __slots__ (presentes en la nueva jerarquia de clases) >>> class F(object): __slots__ = ["rojo", "verde", "azul"] pass >>> f = F() >>> f.rojo = 0xFF >>> f.amarillo = 0x33 Traceback (most recent call last): File "", line 1, in ? f.amarillo = 0x33 AttributeError: 'F' object has no attribute 'amarillo' >>> los slots también sirven para hacer mas "estática" la definición de clases. >>> class G(object): __slots__ = ["rojo", "verde", "azul"] pass >>> f.__class__ = G Traceback (most recent call last): File "", line 1, in ? f.__class__ = G TypeError: __class__ assignment: 'G' object layout differs from 'F' >>> -Hernan From hernan en orgmf.com.ar Fri Aug 23 11:52:44 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 23 Aug 2002 11:52:44 +0200 Subject: =?iso-8859-1?Q?RE:_=5BPython-es=5D_con_o_sin_=22caf=E9-threads=22_;=29?= In-Reply-To: <200208231031.38547.toomany@toomanyhq.homeunix.net> References: <200208231031.38547.toomany@toomanyhq.homeunix.net> Message-ID: > Quisiera saber si me puede perjudicar en algún tema o cosa, el > compilar el python (versión 2.2.1) SIN threads. no deberías tener ningun problema. instala la version sin threads en un directorio exclusivo para el mod_python. así, si mañana necesitas un python con multihilos lo instalas tranquilo sin preocuparte que se "rompa" el apache. (aclaración: nunca usé el mod_python.) saludos, -H. From chemacortes en wanadoo.es Fri Aug 23 12:48:49 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Fri, 23 Aug 2002 11:48:49 +0100 Subject: =?iso-8859-1?q?Re=3A=5BPython=2Des=5DRe=3A_=5BPython=2Des=5DEvoluci=F3n?= =?iso-8859-1?q?_din=E1mica_de_los_objetos_a_diferentes_clases?= Message-ID: > Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? > ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? ¿Qué > pasa si una persona es a la vez cliente y proveedor? Lo que estás pidiendo es una transformación de "casting". Python sí puede hacerlo, más o menos decentemente. Aquí te pongo código que te puede orientar: # Las clases con las que trabajamos class Persona: def __init__(self,nombre): self.nombre=nombre class Cliente: def __init__(self, nombre, cod_cliente): self.nombre=nombre self.cod_cliente=cod_cliente class Proveedor: def __init__(self, nombre, cod_proveedor): self.nombre=nombre self.cod_proveedor=cod_proveedor # No he puesto que "Cliente" y "Proveedor" hereden # de "Persona" para hacerlo más general (Cliente # y Proveedor también podrían ser una empresa) # Creo una persona p=Persona("Pepe") # Se convierte en "Cliente" (y deja de ser "Persona") # Un método sencillo q=Cliente(p.nombre, 1000) # Creamos un nuevo cliente q.__dict__.update(p.__dict__) # Actualizamos a partir de 'p' p=q # Un método algo más seguro import new p=new.instance(Cliente,p.__dict__) # Como con new.instance no se ejecuta el constructor # hay que hacer algunos apañanos a mano p.cod_cliente = 1000 # Ahora queremos convertirlo en "Proveedor", pero que siga # como "Cliente" # Creamos una nueva clase c=new.classobj("ClienteProveedor", (Cliente, Proveedor) , {} ) p=new.instance(c,p.__dict__) p.cod_proveedor=5 # Ahora que está un poco claro cómo hacerlo, generamos una "metaclase" class Negocio: classes={} # almacén para las clases de Negocio def create(name, *classes): # Método estático k=Negocio.classes.get(name,None) if not k: k=new.classobj(name, (Negocio,)+classes, {}) Negocio.classes[name]=k return k create=staticmethod(create) def cast(self, klass, **args): if klass.__name__ not in Negocio.classes.keys(): raise TypeError, klass self.__class__=klass self.__dict__.update(args) # Y así se usaría kPersona=Negocio.create("Persona",Persona) p=kPersona("Pepe") kCliente=Negocio.create("Cliente",Cliente) p.cast(kCliente, cod_cliente=1000) kClienteProveedor=Negocio.create("ClienteProveedor",Cliente,Proveedor) p.cast(kClienteProveedor, cod_proveedor=5) #----------------- Seguramente se puede hacer mejor. Si aprovechas la idea, me gustaría ver cómo queda el resultado final. Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From mostroratas en yahoo.es Fri Aug 23 17:38:25 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Fri, 23 Aug 2002 17:38:25 +0200 (CEST) Subject: Consultas a DNS y Tabla de rutage Message-ID: <20020823153825.46711.qmail@web20907.mail.yahoo.com> Buenas tardes a todos, he intentado buscar en la doc pero no he encontrado nada, sobre como podria preguntarle a un servidor DNS si un nombre esta en la lista (o la informacion que me pudiera dar) o ver si una direccion IP que me dan, es permitida dentro de mi red. Solo se me ocurre ejecutar comandos de sistema, pero no es algo portable, asi que si alguien me puede echar una mano... Gracias. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From hernan en orgmf.com.ar Fri Aug 23 19:43:27 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 23 Aug 2002 19:43:27 +0200 Subject: [Python-es] Consultas a DNS y Tabla de rutage In-Reply-To: <20020823153825.46711.qmail@web20907.mail.yahoo.com> Message-ID: > he intentado buscar en la doc pero no he encontrado nada, sobre > como podria preguntarle a un > servidor DNS si un nombre esta en la lista (o la informacion que > me pudiera dar) o ver si una > direccion IP que me dan, es permitida dentro de mi red. ¿estás usando PyDNS? http://pydns.sf.net -Hernan From aerd en retemail.es Fri Aug 23 19:46:25 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Fri, 23 Aug 2002 19:46:25 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5D_Re:_=5BPython-es=5DRe:_=5BPython-es=5D?= =?iso-8859-1?Q?Evoluci=F3n_din=E1mica_de_los_objetos_a_diferentes_clases?= References: <200208222146.24922.aloy@ctv.es> <001d01c24a26$ccb93e20$0100a8c0@sicem.biz> <200208230112.33077.aloy@ctv.es> Message-ID: <005601c24ad2$e9039970$0100a8c0@sicem.biz> > El Jue 22 Ago 2002 23:28, Ernesto Revilla escrigué: > > Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? > > ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? > > ¿Qué pasa si una persona es a la vez cliente y proveedor? Ya conozco la > > solución antigua: crear dos instancias, una como cliente y otra como > > proveedor, pero la verdad es que no me gusta nada. > From: "Antoni Aloy López" > Se me ocurre que podríamos utilizar el concepto der rol, es decir, no > considerar cliente o proveedor como una clase sino únicamente considerar la > clase persona con una propiedad llamada role que puede contener una lista de > los posibles casos de uso en los que puede encontrarse. Esto podría > implementarse como un diccionario de objetos para poder interrogar mejor a la > clase persona. > Tendría que desarrollarlo un poco más, pero tiene toda la pinta de poder > funcionar... Me gusta en general, ya que una persona es eso, una persona (una empresa tb puede ser considerada una persona jurídica...). Lo que no queda muy claro, cuándo usamos clases y cuándo usamos roles. Supon que 'aparece como cliente' forma una asociación entre 'Persona' y 'Factura'. En general es correcto. El problemas es que a un rol pueden asignarse datos adicionales, en caso del 'Cliente', las condiciones, por ejemplo, si tiene un descuento especial o si se le aplica una determinada tarifa. Esto se llamaría 'CondicionesCliente' que supongo habrá que modelarlo como una clase. Nuestro diseño también iba en esta dirección, de hecho, en nuestro modelo actual (base de datos relaciona con MS-Access) lo tenemos igual, con la excepción que reservamos un 'slot' para cada uno de los roles que puede tener, por los datos adicionales asociados al rol. La segunda solución que comenté unos días antes tenía justamente la ventaja que no hab´ñia que modificar las tablas al crear nuevas asociaciones, sino a lo mejotr sólo crear tablas nuevas, un aspecto muy interesante. Muchas gracias, pensaré sobre el tema de roles con sus datos adicionales y sus posibles implementaciones. Erny From aerd en retemail.es Fri Aug 23 19:53:17 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Fri, 23 Aug 2002 19:53:17 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DRe:_=5BPython-es=5DEvoluci=F3n_di?= =?iso-8859-1?Q?n=E1mica_de_los_objetos_a_diferentes_clases?= References: <1de3b24b2a.24b2a1de3b@page.melange.net> Message-ID: <005701c24ad2$eb7312d0$0100a8c0@sicem.biz> Hola, sí es algo un tanto nuevo. Lo que no tengo claro es que si tiene que ejecutarse o no el __init__ del nuevo tipo. Pienso que estas transformaciones deberían estar contempladas en el sentido que si cambiamos la base debería de correr algún método de __convertFrom__(self) que permitiese o no la conversión y que pudiese realizar tareas especiales. Erny ----- Original Message ----- From: "rapto" To: Sent: Friday, August 23, 2002 10:12 AM Subject: [Python-es]Re: [Python-es]Evolución dinámica de los objetos a diferentes clases > Bueno, más sencillo y legible, imposible. No me parece una filigrana > técnica, tampoco. Si me hablas de que es una locura cambiar de clase un > objeto, lo que es 'ilegible' es el diseño de la aplicación, no la > solución técnica. En Python, que un objeto sea de una clase u otra no > debe depender más que de su atributo __class__, lo que es bastante > pitónico. De todos modos, entiendo que la migración de clase será entre > clases similares, de 'apunte no contabilizado' a 'apunte > contaabilizado' y cosas así. > > En resumidas cuentas, me parece como el asunto de la declaración de > tipos (un poco a lo bestia, eso lo admito, pero debe ser porque me > quedan prejuicios de cuando programaba en VB). > > Saludos > > ----- Mensaje Original ----- > Remitente: Antoni Aloy López > Fecha: Jueves, Agosto 22, 2002 9:46 pm > Asunto: Re: [Python-es]Evolución dinámica de los objetos a diferentes > clases > > > El Jue 22 Ago 2002 21:14, Marcos Sánchez Provencio escrigué: > > > En cosas sencillas, he probado y vale con meterle el __class__ a > > pelo.> Había que probarlo :-D > > > > > > class a: > > > def x(self): > > > return 'a' > > > > > > class b: > > > def x(self): > > > return 'b' > > > > > > aa=a() > > > print aa.x() > > > aa.__class__=b > > > print aa.x() > > > > > > > Muy bonito, e imposible de mantener :( > > > > Depende mucho de tu aplicación, pero yo estoy por hacer algo menos > > genérico y > > más sencillo de leer/depurar/modificar, que al fin y al cabo > > representa un > > 80% del ciclo de vida de un programa. > > > > Tanto la clase cliente como proveedor pueden heredar directamente > > de persona, > > la clase básica. La persistencia se podría sobreescribir cada vez, > > o > > separarla en varios procedimientos para poder reaprovechar mejor > > el código. > > > > Seguir la norma KISS suele ser lo mejor en estos casos, puedes > > encontrar > > soluciones técnicamente espectaculares, pero la simplicidad del > > código es una > > virtud en sí misma. > > -- > > > > Antoni Aloy López > > Binissalem - Mallorca > > Linux Registered User # 210825 > > Gentoo Powered > > > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es > > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From aerd en retemail.es Fri Aug 23 20:24:04 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Fri, 23 Aug 2002 20:24:04 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DRE:_Representaci=F3n_de_asociaciones_en?= =?iso-8859-1?Q?_bases_de_datos?= References: Message-ID: <005a01c24ad2$ecc97b10$0100a8c0@sicem.biz> Hola, ----- Original Message ----- From: "Hernan Martinez Foffani" To: Sent: Friday, August 23, 2002 11:42 AM Subject: [Python-es]RE: Representación de asociaciones en bases de datos > > > en cuanto a mantenimiento... lo que sí te puedo asegurar es que si > > > cada atributo del modelo de objetos es una tabla, el administrador > > > no lo va a tener facil ;-) > > Cada clase va a ser una tabla, no cada atributo. > > ah... ok. esto cambia las cosas, no habia entendido bien la idea. > por lo que veo vas a seguir el esquema tradicional de Objetct/Relational. > quizás este paper te puede ser util: > http://www.objectarchitects.de/ObjectArchitects/papers/Published/ZippedPaper > s/mappings04.pdf > tiene varias referencias a otro papers que tambien te pueden servir. Gracias, le echaré un vistazo. Trabajo sobre las ideas expresadas en http://www.ambysoft.com/persistenceLayer.html y algunas cunatas implementaciones en Java (básicamente http://www.castor.org y http://player.sf.net ) > me refería a que una vez congelado no permitir luego la modificacion > *dinamica* de la estructura de clases. algo como: > > >>> C.__bases__ = (D,) > Traceback (most recent call last): > File "", line 1, in ? > C.__bases__ = (D,) > TypeError: __bases__ is frozen. Esto ¿cómo se hace? ¿Cómo se puede congelar un tipo? Temas slots: He leído sobre los nuevos inventos en Python 2.2 . De momento sólo uso las properties, es decir, a partir de un archivo de definición de modelo (donde se indican sólo las clases con sus atributos y tipos) se genera un archivo python que crea cada uno de los atributos. Las propiedades me permiten comprobar quién accede cuando y al establecer un valor, si tiene el tipo correcto. (Hay más cosas.) Las clases generadas siempre se machacan al cambiar el modelo y regenerarlos, pero el usuario escribe su propia clase heredando de la generada. Ejemplo: modelo.txt: (Persona, class, {attributes: [ (nombre, string ), (apellidos, string ), (fechaCreacion, timestamp, {defaultvalue: 'timestamp()'} ), } ) (Cliente, class, {extends: [Persona], attributes: [ (vendedor, Persona[1]) ] } ) Para cada clase se genera una clase Gen, es decir, GenPersona y GenCliente. un ejemplo del código generado: GenPersona.py: class GenPersona(PersistentObject): _class=classmap['Persona'] # para cada propiedad.... def get_apellidos(self): return PersistentObject.getProperty(self,'apellidos') def set_apellidos(self,value): PersistentObject.setProperty(self,'apellidos',value) apellidos=property(get_apellidos,set_apellidos) pero el código generado le puede dar igual al programador que tiene que hacer lo siguiente (aunque se crea una plantilla por defecto, si no existe): Persona.py: from GenPersona import GenPersona class Persona(GenPersona): # aquí van todos los métodos del programador def saludar(self): print "Hola. Me llamamo", self.nombre, self.apellidos # Para cambiar la manera de leer o asignar valores, es simple: def set_apellidos(self,nuevosApellidos): print "me cambio de apellidos, los nuevos son:", nuevosApellidos GenPersona.set_apellidos(self,nuevosApellidos) estas ideas salen de webware/MiddleKit: http://webware.sourceforge.net/Webware-0.7/MiddleKit/Docs/index.html Es posible que la generación del archivo GenPersona desaparezca del todo, quitar así una etapa más, la generación se haría mediante metaclases durante la carga del modelo. Cuando tenga algo más sólido ya os avisaré porque me gustaría que lo probarais, pero todavía falta uno o dos meses. Erny From aerd en retemail.es Fri Aug 23 20:28:34 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Fri, 23 Aug 2002 20:28:34 +0200 Subject: =?iso-8859-1?Q?Re:_=5BPython-es=5DRe:=5BPython-es=5DRe:_=5BPython-es=5DEv?= =?iso-8859-1?Q?oluci=F3n_din=E1mica_de_los_objetos_a_diferentes_clases?= References: Message-ID: <005b01c24ad2$ede59970$0100a8c0@sicem.biz> Extraordinariamente interesante, todavía tengo que ir a través del código un poco más detenidamente. Gracias. Erny ----- Original Message ----- From: "Chema Cortes" To: Sent: Friday, August 23, 2002 12:48 PM Subject: [Python-es]Re:[Python-es]Re: [Python-es]Evolución dinámica de los objetos a diferentes clases > > Eso está claro, pero ¿qué pasa si una persona se convierte en cliente? > > ¿Tengo que borrarlo de personas y crear una nueva instancia de cliente? ¿Qué > > pasa si una persona es a la vez cliente y proveedor? > > Lo que estás pidiendo es una transformación de "casting". Python sí puede hacerlo, más o menos decentemente. Aquí te pongo código que te puede orientar: > > # Las clases con las que trabajamos > > class Persona: > def __init__(self,nombre): > self.nombre=nombre > > class Cliente: > def __init__(self, nombre, cod_cliente): > self.nombre=nombre > self.cod_cliente=cod_cliente > > class Proveedor: > def __init__(self, nombre, cod_proveedor): > self.nombre=nombre > self.cod_proveedor=cod_proveedor > > # No he puesto que "Cliente" y "Proveedor" hereden > # de "Persona" para hacerlo más general (Cliente > # y Proveedor también podrían ser una empresa) > > > # Creo una persona > p=Persona("Pepe") > > # Se convierte en "Cliente" (y deja de ser "Persona") > > # Un método sencillo > q=Cliente(p.nombre, 1000) # Creamos un nuevo cliente > q.__dict__.update(p.__dict__) # Actualizamos a partir de 'p' > p=q > > # Un método algo más seguro > import new > p=new.instance(Cliente,p.__dict__) > > # Como con new.instance no se ejecuta el constructor > # hay que hacer algunos apañanos a mano > p.cod_cliente = 1000 > > # Ahora queremos convertirlo en "Proveedor", pero que siga > # como "Cliente" > # Creamos una nueva clase > c=new.classobj("ClienteProveedor", (Cliente, Proveedor) , {} ) > p=new.instance(c,p.__dict__) > p.cod_proveedor=5 > > # Ahora que está un poco claro cómo hacerlo, generamos una "metaclase" > class Negocio: > classes={} # almacén para las clases de Negocio > > def create(name, *classes): # Método estático > k=Negocio.classes.get(name,None) > if not k: > k=new.classobj(name, (Negocio,)+classes, {}) > Negocio.classes[name]=k > return k > create=staticmethod(create) > > def cast(self, klass, **args): > if klass.__name__ not in Negocio.classes.keys(): > raise TypeError, klass > self.__class__=klass > self.__dict__.update(args) > > > # Y así se usaría > kPersona=Negocio.create("Persona",Persona) > p=kPersona("Pepe") > kCliente=Negocio.create("Cliente",Cliente) > p.cast(kCliente, cod_cliente=1000) > > kClienteProveedor=Negocio.create("ClienteProveedor",Cliente,Proveedor) > p.cast(kClienteProveedor, cod_proveedor=5) > > #----------------- > > Seguramente se puede hacer mejor. Si aprovechas la idea, me gustaría ver cómo queda el resultado final. > > Saludos, > -- > Chema Cortes (chemacortes en wanadoo.es) > _____________________________________________________________________ > Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo > ¡¡ desde las 3 de la tarde!! > Compruébalo en http://www.wanadoo.es/acceso-internet > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From rapto en arrakis.es Sat Aug 24 11:41:56 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 24 Aug 2002 11:41:56 +0200 Subject: [Python-es]Re: Subject: Re: [Python-es] Re: [Python-es]Re: =?ISO-8859-1?Q?=5BPython-es=5DEvoluci=F3n?= =?ISO-8859-1?Q?_din=E1mica?= de los objetos a diferentes clases In-Reply-To: <005701c24ad2$eb7312d0$0100a8c0@sicem.biz> References: <1de3b24b2a.24b2a1de3b@page.melange.net> <005701c24ad2$eb7312d0$0100a8c0@sicem.biz> Message-ID: <1030182117.1716.49.camel@renata.macondo.pri> Yo creo que debería haber (no sé si hay PEPs de esto) un método especial __cast__ que haría los cambios necesarios. Por supuesto, este método recogería toda la información necesaria para que la nueva clase se comportara como se espera. Por ejemplo, en una jerarquía Persona \--Cliente Donde el único atributo nuevo del cliente es un id_cliente habría que hacer un cast unaPersona=Persona() nuevoCliente=Cliente.__cast__(unaPersona, id_cliente=2323) Ahora veo que no puede ser un método, sino una función estática de la clase. Código para Python 2.2 sin verificar: class Cliente: def __cast__(objetoBase, **kw): if type(objetoBase)==TipoPersona: objetoBase.__class__=Cliente objetoBase.id_cliente=kw['id_cliente'] else: raise NotImplemented __cast__=classmethod(__cast__) De momento habría que llamarlo a pelo, pero quedaría más mono con Cliente[unaPersona, id_cliente=2323] Parecido a crear una nueva instancia,, pero diferente, o soluciones similares. ¿Un voluntario para sacar un parche para la 2.3? ¿Se puede redefinir __lsub__ para que haga eso? El vie, 23-08-2002 a las 19:53, Ernesto Revilla escribió: > Hola, > > sí es algo un tanto nuevo. > Lo que no tengo claro es que si tiene que ejecutarse o no el __init__ del > nuevo tipo. > > Pienso que estas transformaciones deberían estar contempladas en el sentido > que si cambiamos la base debería de correr algún método de > __convertFrom__(self) que permitiese o no la conversión y que pudiese > realizar tareas especiales. > > Erny > > > ----- Original Message ----- > From: "rapto" > To: > Sent: Friday, August 23, 2002 10:12 AM > Subject: [Python-es]Re: [Python-es]Evolución dinámica de los objetos a > diferentes clases > > > > Bueno, más sencillo y legible, imposible. No me parece una filigrana > > técnica, tampoco. Si me hablas de que es una locura cambiar de clase un > > objeto, lo que es 'ilegible' es el diseño de la aplicación, no la > > solución técnica. En Python, que un objeto sea de una clase u otra no > > debe depender más que de su atributo __class__, lo que es bastante > > pitónico. De todos modos, entiendo que la migración de clase será entre > > clases similares, de 'apunte no contabilizado' a 'apunte > > contaabilizado' y cosas así. > > > > En resumidas cuentas, me parece como el asunto de la declaración de > > tipos (un poco a lo bestia, eso lo admito, pero debe ser porque me > > quedan prejuicios de cuando programaba en VB). > > > > Saludos > > > > ----- Mensaje Original ----- > > Remitente: Antoni Aloy López > > Fecha: Jueves, Agosto 22, 2002 9:46 pm > > Asunto: Re: [Python-es]Evolución dinámica de los objetos a diferentes > > clases > > > > > El Jue 22 Ago 2002 21:14, Marcos Sánchez Provencio escrigué: > > > > En cosas sencillas, he probado y vale con meterle el __class__ a > > > pelo.> Había que probarlo :-D > > > > > > > > class a: > > > > def x(self): > > > > return 'a' > > > > > > > > class b: > > > > def x(self): > > > > return 'b' > > > > > > > > aa=a() > > > > print aa.x() > > > > aa.__class__=b > > > > print aa.x() > > > > > > > > > > Muy bonito, e imposible de mantener :( > > > > > > Depende mucho de tu aplicación, pero yo estoy por hacer algo menos > > > genérico y > > > más sencillo de leer/depurar/modificar, que al fin y al cabo > > > representa un > > > 80% del ciclo de vida de un programa. > > > > > > Tanto la clase cliente como proveedor pueden heredar directamente > > > de persona, > > > la clase básica. La persistencia se podría sobreescribir cada vez, > > > o > > > separarla en varios procedimientos para poder reaprovechar mejor > > > el código. > > > > > > Seguir la norma KISS suele ser lo mejor en estos casos, puedes > > > encontrar > > > soluciones técnicamente espectaculares, pero la simplicidad del > > > código es una > > > virtud en sí misma. > > > -- > > > > > > Antoni Aloy López > > > Binissalem - Mallorca > > > Linux Registered User # 210825 > > > Gentoo Powered > > > > > > _______________________________________________ > > > Python-es mailing list > > > Python-es en aditel.org > > > http://listas.aditel.org/listinfo.py/python-es > > > > > > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From faraox en gulic.org Sat Aug 24 13:55:12 2002 From: faraox en gulic.org (Carlos Mestre =?iso-8859-1?Q?Gonz=E1lez?=) Date: Sat, 24 Aug 2002 13:55:12 +0200 Subject: =?iso-8859-1?Q?Presentaci=F3n?= Message-ID: <20020824115512.GA443@gulic.org> Buenas: Soy nuevo en la lista, y quisiera presentarme. Soy Carlos Mestre González y hace varios años que conosco la existencia de python y siempre me ha interesado. Estas últimas semanas me he puesto a leer otra vez cosas, ya que hace tiempo también estube probando cosas. Lo cierto es que estoy leyendome la guía oficial, ya que lo básico lo domino, pero a partir de ciertas partes tengo que volver a leer, ya hay cosas que he olvidado. También estoy empezando a leer el Dive in python, en español por supuesto. Bueno, me he subscrito a ver si puedo aprender más cosas con vosotros. Una pregunta, sobre ejercicios. ¿Teneis alguno alguna web con ejercicios hechos? Saludos -- <>---------------------------------------------------------------<> <>| Carlos Mestre González -- |<> <>| La Palma - Canarias - España |o_o| |<> <>| |:_/| |<> <>| Y pertenezco al LUG con más marcha, GULIC // \ |<> <>| GULIC(Grupo de Usuarios de Linux de Canarias) (| |) |<> <>| Pásate por nuestra web: http://www.gulic.org /\_ _/\ |<> <>| \__)=(_/ |<> <>---------------------------------------------------------------<> Cuán vano es sentarse a escribir cuando aún no te has levantado para vivir. -- Henry David Thoreau. (1817-1862) Escritor, poeta y pensador. From zoso en demiurgo.org Sat Aug 24 14:22:52 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Sat, 24 Aug 2002 13:22:52 +0100 Subject: [Python-es] =?iso-8859-1?Q?Presentaci?= =?iso-8859-1?Q?=F3n?= In-Reply-To: <20020824115512.GA443@gulic.org> References: <20020824115512.GA443@gulic.org> Message-ID: <20020824122252.GG573@demiurgo.org> On Sat, Aug 24, 2002 at 01:55:12PM +0200, Carlos Mestre González wrote: > [...] > Bueno, me he subscrito a ver si puedo aprender más cosas con > vosotros. Una pregunta, sobre ejercicios. ¿Teneis alguno alguna > web con ejercicios hechos? Hay por ahí una web llamada «Useless Python» (algo así como «Python inútil»), y creo que está traducida. A ver... pues parece que no. La página original está en http://www.uselesspython.com/ . -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow PD: Ya somos al menos tres Guliqueros en la lista ;-) ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From faraox en gulic.org Sat Aug 24 15:15:03 2002 From: faraox en gulic.org (Carlos Mestre =?iso-8859-1?Q?Gonz=E1lez?=) Date: Sat, 24 Aug 2002 15:15:03 +0200 Subject: [Python-es] =?iso-8859-1?Q?Presentaci?= =?iso-8859-1?Q?=F3n?= In-Reply-To: <20020824122252.GG573@demiurgo.org> References: <20020824115512.GA443@gulic.org> <20020824122252.GG573@demiurgo.org> Message-ID: <20020824131503.GA568@gulic.org> > > Hay por ahí una web llamada «Useless Python» (algo así como «Python > inútil»), y creo que está traducida. A ver... pues parece que no. La página > original está en http://www.uselesspython.com/ . A vale, me hubiera gustado más en español, bueno, pero con el inglés me defiendo, gracias por tu ayuda. ¿3 guliceros? ¿cuales? A ver si puedo luego hechar una mano con el brocha X). Saludos -- <>---------------------------------------------------------------<> <>| Carlos Mestre González -- |<> <>| La Palma - Canarias - España |o_o| |<> <>| |:_/| |<> <>| Y pertenezco al LUG con más marcha, GULIC // \ |<> <>| GULIC(Grupo de Usuarios de Linux de Canarias) (| |) |<> <>| Pásate por nuestra web: http://www.gulic.org /\_ _/\ |<> <>| \__)=(_/ |<> <>---------------------------------------------------------------<> Estos que agora nos mandan reinan para sí y por la misma causa no se disponen para nuestro provecho, sino buscan su descanso en nuestro daño. -- Fray Luis de León -- From chemacortes en wanadoo.es Sat Aug 24 18:53:10 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-1?q?Cort=E9s?=) Date: Sat, 24 Aug 2002 18:53:10 +0200 Subject: [Python-es] =?iso-8859-1?q?Re=3A=5BPython-es=5DEvoluci=F3n=20din=E1mica=20de=20los?= objetos a diferentes clases In-Reply-To: <1030182117.1716.49.camel@renata.macondo.pri> References: <1de3b24b2a.24b2a1de3b@page.melange.net> <005701c24ad2$eb7312d0$0100a8c0@sicem.biz> <1030182117.1716.49.camel@renata.macondo.pri> Message-ID: <200208241853.13765.chemacortes@wanadoo.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El Sáb 24 Ago 2002 11:41, Marcos Sánchez Provencio escribió: > Yo creo que debería haber (no sé si hay PEPs de esto) un método especial > __cast__ que haría los cambios necesarios. Lo más parecido es el __coerce__. Pero sospecho que para ver algún día un operador __cast__ habría que conseguir la unificación real de tipos y clases. > unaPersona=Persona() > nuevoCliente=Cliente.__cast__(unaPersona, id_cliente=2323) En el python actual, el casting lo hace el contructor __init__ utilizando el "polimorfismo" característico de programación orientada a objeto. Es como se simulan las funciones para conversión de tipos. Por ejemplo: a=1.0 # float a=str(a) # string desde float a=complex(a) # complex desde string > Ahora veo que no puede ser un método, sino una función estática de la > clase. > Código para Python 2.2 sin verificar: > > class Cliente: > def __cast__(objetoBase, **kw): > if type(objetoBase)==TipoPersona: > objetoBase.__class__=Cliente > objetoBase.id_cliente=kw['id_cliente'] > else: > raise NotImplemented > __cast__=classmethod(__cast__) Ya veo que dices que no lo has revisado, porque hay algunos fallos importantes. Para que __cast__ fuera método estático, debería ser: __cast__=staticmethod(__cast__) A parte de esto, type(objetoBase)==TipoPersona no funcionará como esperas tal como están definidas las clases. Deberían utilizar el nuevo mecanismo de generación de clases (que derivan todas de la clase primaria 'object'). También se podría haber utilizado la función 'isinstance()': if isinstance(objetoBase,Persona): Pero tal como decía antes, si usamos el constructor polimórfico __init__ para hacer operaciones de casting, quedaría así: class Cliente(Persona): def __init__(self,*args): """Interfaces: Cliente(nombre, id_cliente) -> Nuevo cliente Cliente(persona, id_cliente) -> Cliente a partir de persona """ if len(args)!=0: raise TypeError, "Necesitaba exactamente 2 argumentos" if type(args[0]) is types.InstanceType: # Nos pasan un objeto obj=args[0] if isinstance(obj, Persona): # Casting a partir de un objeto de la clase "Persona" self.nombre=obj.nombre self.id_cliente=int(args[1]) else: # Podíamos mirar otros "castings" # y si no, dar una excepción else: self.nombre=str(args[0]) self.id_cliente=int(args[0]) > De momento habría que llamarlo a pelo, pero quedaría más mono con > > Cliente[unaPersona, id_cliente=2323] Con la última definición sería así: Cliente(unaPersona, id_cliente=2323) > Parecido a crear una nueva instancia,, pero diferente, o soluciones > similares. ¿Un voluntario para sacar un parche para la 2.3? ¿Se puede > redefinir __lsub__ para que haga eso? No entiendo a qué te refieres con __lsub__ Saludos, - -- Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien PYTANDO http://pytando.sf.net | se contenta con lo que sabe" PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9Z7n5HLTQrABk8H0RAo1KAJ4jGSKBwpb52N183ErAIy6QBFIszgCg7aak TjzzkFxJgAKzmF2H6seG5AE= =Y9hC -----END PGP SIGNATURE----- From rapto en arrakis.es Sun Aug 25 14:34:17 2002 From: rapto en arrakis.es (Marcos =?ISO-8859-1?Q?S=E1nchez?= Provencio) Date: 25 Aug 2002 14:34:17 +0200 Subject: [Python-es] =?ISO-8859-1?Q?Re=3A=5BPython-es=5DEvoluci=F3n?= =?ISO-8859-1?Q?_din=E1mica?= de los objetos a diferentes clases In-Reply-To: <200208241853.13765.chemacortes@wanadoo.es> References: <1de3b24b2a.24b2a1de3b@page.melange.net> <005701c24ad2$eb7312d0$0100a8c0@sicem.biz> <1030182117.1716.49.camel@renata.macondo.pri> <200208241853.13765.chemacortes@wanadoo.es> Message-ID: <1030278857.8781.6.camel@renata.macondo.pri> Perdón por los errores, debería haber escrito seudocódigo para hacer evidente que no estaba revisado. Más que casting (crear un objeto a partir de otro) estaba pensando en morphing (convertir un objeto a otra clase). De ahí lo de utilizar un método de clase, para no generar un objeto nuevo y tratar siempre con el anterior. El sáb, 24-08-2002 a las 18:53, Chema Cortés escribió: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > El Sáb 24 Ago 2002 11:41, Marcos Sánchez Provencio escribió: > > > Yo creo que debería haber (no sé si hay PEPs de esto) un método especial > > __cast__ que haría los cambios necesarios. > > > Lo más parecido es el __coerce__. Pero sospecho que para ver algún día un > operador __cast__ habría que conseguir la unificación real de tipos y clases. > > > unaPersona=Persona() > > nuevoCliente=Cliente.__cast__(unaPersona, id_cliente=2323) > > > En el python actual, el casting lo hace el contructor __init__ utilizando el > "polimorfismo" característico de programación orientada a objeto. Es como se > simulan las funciones para conversión de tipos. Por ejemplo: > > a=1.0 # float > a=str(a) # string desde float > a=complex(a) # complex desde string > > > > Ahora veo que no puede ser un método, sino una función estática de la > > clase. > > Código para Python 2.2 sin verificar: > > > > class Cliente: > > def __cast__(objetoBase, **kw): > > if type(objetoBase)==TipoPersona: > > objetoBase.__class__=Cliente > > objetoBase.id_cliente=kw['id_cliente'] > > else: > > raise NotImplemented > > __cast__=classmethod(__cast__) > > Ya veo que dices que no lo has revisado, porque hay algunos fallos > importantes. Para que __cast__ fuera método estático, debería ser: > > __cast__=staticmethod(__cast__) > > A parte de esto, type(objetoBase)==TipoPersona no funcionará como esperas tal > como están definidas las clases. Deberían utilizar el nuevo mecanismo de > generación de clases (que derivan todas de la clase primaria 'object'). > También se podría haber utilizado la función 'isinstance()': > > if isinstance(objetoBase,Persona): > > > Pero tal como decía antes, si usamos el constructor polimórfico __init__ para > hacer operaciones de casting, quedaría así: > > > class Cliente(Persona): > def __init__(self,*args): > """Interfaces: > > Cliente(nombre, id_cliente) -> Nuevo cliente > Cliente(persona, id_cliente) -> Cliente a partir de persona > """ Sigue siendo un _nuevo_ objeto, que era lo que queríamos evitar. En este caso daría casi igual, pero un caso más complicado (conexiones a BD, ficheros abiertos, servidores XMLRPC con estados difíciles de recuperar...) sería más embrollado. > > if len(args)!=0: > raise TypeError, "Necesitaba exactamente 2 argumentos" > > if type(args[0]) is types.InstanceType: > # Nos pasan un objeto > obj=args[0] > if isinstance(obj, Persona): > # Casting a partir de un objeto de la clase "Persona" > self.nombre=obj.nombre > self.id_cliente=int(args[1]) > else: > # Podíamos mirar otros "castings" > # y si no, dar una excepción > else: > self.nombre=str(args[0]) > self.id_cliente=int(args[0]) > > > > De momento habría que llamarlo a pelo, pero quedaría más mono con > > > > Cliente[unaPersona, id_cliente=2323] > > Con la última definición sería así: > > Cliente(unaPersona, id_cliente=2323) > > > > Parecido a crear una nueva instancia,, pero diferente, o soluciones > > similares. ¿Un voluntario para sacar un parche para la 2.3? ¿Se puede > > redefinir __lsub__ para que haga eso? > > No entiendo a qué te refieres con __lsub__ > No revisé el texto; supongo que habría que redefinir algo para que la sintaxis de claseNueva[claseVieja, parámetros] funcionara. > > Saludos, > - -- > Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 > ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien > PYTANDO http://pytando.sf.net | se contenta con lo que sabe" > PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.0.6 (GNU/Linux) > Comment: For info see http://www.gnupg.org > > iD8DBQE9Z7n5HLTQrABk8H0RAo1KAJ4jGSKBwpb52N183ErAIy6QBFIszgCg7aak > TjzzkFxJgAKzmF2H6seG5AE= > =Y9hC > -----END PGP SIGNATURE----- > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From Arkaitz.Bitorika en cs.tcd.ie Sun Aug 25 16:52:34 2002 From: Arkaitz.Bitorika en cs.tcd.ie (Arkaitz Bitorika) Date: 25 Aug 2002 15:52:34 +0100 Subject: =?ISO-8859-1?Q?Evoluci=F3n?= =?ISO-8859-1?Q?_din=E1mica?= de los objetos a diferentes clases In-Reply-To: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> Message-ID: <1030287154.1976.6.camel@foleys> Ernesto, Has pensado en usar el design pattern ("patron de diseino"?) "State"? Es basicamente la idea que dio Antoni de utilizar roles, o cierto estado asociado con cada instancia de Persona. De esta manera, cuando cambies el estado o rol de Cliente a Proveedor o lo que sea, cambias solo esa asociacion. Este patron esta explicado muy bien en Design Patterns por Gamma et al. saludos, Arkaitz On Thu, 2002-08-22 at 18:50, Ernesto Revilla wrote: > Hola, > > no tiene que ver directamente con Python, más bien con programación > orientado a objeto. > > Suponed que hay una clase Persona y otras dos clases que heredan de allí, > Cliente y Proveedor. > > 1. ¿Cómo puede modelarse que un objeto 'evoluciona' de un la a otro, por > ejemplo, Persona evoluciona a ser Cliente. > ¿se puede cambiar la clase de un objeto dinámicamente? > (ya sé que se puede borrar y crear un objeto nuevo de la otra clase, ¿hay > otra manera?) > > 2. ¿Cómo podría hacerse que un objeto Cliente evolucionase a una clase > Proveedor? (Es decir, una clase que no está en la rama de la clase actual > del árbol de herencia.) > > 3. He visto alguna vez algo como esto: > C.__bases__.append(D) # siendo C clase y D clase > > Aunque no resuelva el tema de 1. y 2., me parecía interesante, poder > enriquecer la funcionalidad de una clase, agregandole clases bases. > > Respecto a 1. y 2. hemos llegado a la conclusión modelarlo de otra manera: > crear clases Persona, DatosCliente y DatosProveedor, y hacer que Persona > tenga una referencia opcional a cada uno. Si una persona nos compra algo y > no tiene parte de cliente, esta es creada y asociada. Preguntar si un > persona es cliente coincide con mirar si tiene una parte de datos de > cliente. > > ¿Por qué me importa eso? Por el tema de la persistencia. El tema de dejar > evolucionar dinámicamente a los objetos, me crea ciertos trastornos a la > hora de las actualizaciones. > > Saludos, > Erny > > > > > > > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From miguev en gulic.org Sun Aug 25 23:19:25 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Sun, 25 Aug 2002 22:19:25 +0100 Subject: =?iso-8859-15?Q?Presentaci?= =?iso-8859-15?Q?=F3n?= In-Reply-To: <20020824131503.GA568@gulic.org> References: <20020824115512.GA443@gulic.org> <20020824122252.GG573@demiurgo.org> <20020824131503.GA568@gulic.org> Message-ID: <20020825211925.GA12504@Harry> On Sat, Aug 24, 2002 at 03:15:03PM +0200, Carlos Mestre González wrote: > > > > Hay por ahí una web llamada «Useless Python» (algo así como «Python > > inútil»), y creo que está traducida. A ver... pues parece que no. La página > > original está en http://www.uselesspython.com/ . > > > A vale, me hubiera gustado más en español, bueno, pero con el > inglés me defiendo, gracias por tu ayuda. ¿3 guliceros? ¿cuales? > A ver si puedo luego hechar una mano con el brocha X). Parece mentira que no te imaginaras quién sería el tercer gulicero ;-) Saludetes y bienvenido a la lista. -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Ni camino sin atajo ni campana sin badajo. ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From miguev en gulic.org Sun Aug 25 23:39:48 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Sun, 25 Aug 2002 22:39:48 +0100 Subject: [Python-es] Expect contra smbpasswd Message-ID: <20020825213948.GA12724@Harry> Estoy intentando cambiar la clave Samba de un usuario (desde root) con el módulo de Expect para Python, pero no me funciona. El código que estoy usando es de un ejemplo que trae el paquete python-expect de Debian (uso SID): ----- autopasswd.py ----------------------- import sys, time, string from expect import * f = popen2 ("passwd usuario", "p") f.read ("word: ") time.sleep (0.1) f.write ("unaclave\n") f.read ("word: ") time.sleep (0.1) f.write ("unaclave\n") print string.strip (f.read ()) --------------------------------------------- Lo único que he cambiado es el comando ejecutado en la tubería, en lugar de passwd he puesto smbpasswd, pero parece que no se deja. El caso es que se traba la primera llamada al read() Probándolo en el intérprete se queda indefinidamente en espera: >>> import expect >>> fd = expect.popen2 ('smbpasswd', 'p') >>> fd.read () (aquí se queda hasta que corto con Control-C) ¿Qué estoy haciendo mal? Una luz, porfa... Saludos. -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Mi madre nunca me dio el pecho porque decía que sólo me quería como amigo. ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From fmarcelo en airtel.net Mon Aug 26 00:39:16 2002 From: fmarcelo en airtel.net (=?iso-8859-15?q?F=E9lix=20J=2E=20Marcelo?= Wirnitzer) Date: Sun, 25 Aug 2002 23:39:16 +0100 Subject: [Python-es] =?iso-8859-15?q?Presentaci=F3n?= In-Reply-To: <20020825211925.GA12504@Harry> References: <20020824115512.GA443@gulic.org> <20020824131503.GA568@gulic.org> <20020825211925.GA12504@Harry> Message-ID: Según dijo Miguel Ángel Vilela el Dom 25 Ago 2002 22:19, # On Sat, Aug 24, 2002 at 03:15:03PM +0200, Carlos Mestre González wrote: # > > # > > Hay por ahí una web llamada «Useless Python» (algo así como «Python # > > inútil»), y creo que está traducida. A ver... pues parece que no. La página # > > original está en http://www.uselesspython.com/ . # > # > # > A vale, me hubiera gustado más en español, bueno, pero con el # > inglés me defiendo, gracias por tu ayuda. ¿3 guliceros? ¿cuales? # > A ver si puedo luego hechar una mano con el brocha X). # # Parece mentira que no te imaginaras quién sería el tercer gulicero ;-) # # Saludetes y bienvenido a la lista. Aquí un cuarto gulicero -- Félix J. Marcelo Wirnitzer fmarcelo en airtel.net From pabloruiz en gnu.org Mon Aug 26 00:48:03 2002 From: pabloruiz en gnu.org (Pablo Ruiz =?ISO-8859-1?B?Tfp6cXVpeg==?=) Date: Mon, 26 Aug 2002 00:48:03 +0200 Subject: [Python-es] convertir glade1 en glade2 Message-ID: <20020826004803.0d942c1c.pabloruiz@gnu.org> Hola. Hace un par de semanas me puse a escribir un proyecto con python y glade. Es una tontería y lo estoy usando sólo para experimentar. Se trata de un cliente IMAP de correo muy sencillito para llevarlo a todas partes. La cuestión es que quisiera pasar a usar libglade-2.0, que va con las GTK 2.0 y para ello es necesario usar glade-2 en vez de glade. Pues bien, existe un conversor de ficheros glade1 a glade2 que se llama libglade-convert y que se supone que funciona con la mayoría de ficheros. menos con el mío. Parece que el parseador XML expat de python se hace un lío. En principio cumplo todos los requisitos para usar el programa de marras. Querría saber si alguien ya ha trasteado con esto y sabe qué hacer en estos casos. Uso Debian unstable Gracias por adelantado. PS: GTK 2.0, a simple vista parece mucho más elegante. -- Pablo Ruiz Múzquiz pabloruiz en gnu.org :: http://elenya.net --------------------------------------- KEY FINGERPRINT -> 2BB2 E013 3137 DB03 878C 14D3 B95D 3DD2 17B0 0619 GPG -> http://elenya.net/pabloruiz --------------------------------------- From chemacortes en wanadoo.es Mon Aug 26 01:52:31 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-15?q?Cort=E9s?=) Date: Mon, 26 Aug 2002 01:52:31 +0200 Subject: [Python-es] Expect contra smbpasswd In-Reply-To: <20020825213948.GA12724@Harry> References: <20020825213948.GA12724@Harry> Message-ID: <200208260152.32018.chemacortes@wanadoo.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El Dom 25 Ago 2002 23:39, Miguel Ángel Vilela escribió: > Estoy intentando cambiar la clave Samba de un usuario (desde root) con > el módulo de Expect para Python, pero no me funciona. El código que > estoy usando es de un ejemplo que trae el paquete python-expect de > Debian (uso SID): > > ----- autopasswd.py ----------------------- > import sys, time, string > from expect import * > > f = popen2 ("passwd usuario", "p") > f.read ("word: ") > time.sleep (0.1) > f.write ("unaclave\n") > f.read ("word: ") > time.sleep (0.1) > f.write ("unaclave\n") > print string.strip (f.read ()) > --------------------------------------------- > > Lo único que he cambiado es el comando ejecutado en la tubería, en > lugar de passwd he puesto smbpasswd, pero parece que no se deja. El > caso es que se traba la primera llamada al read() Probándolo en el > > intérprete se queda indefinidamente en espera: > >>> import expect > >>> fd = expect.popen2 ('smbpasswd', 'p') > >>> fd.read () > > (aquí se queda hasta que corto con Control-C) > > ¿Qué estoy haciendo mal? Una luz, porfa... No tengo el expect para hacer la prueba (justo en este momento está cerrado sourceforge). Aún así he leido la documentación, y a parte de cambiar el comando, también has cambiado la llamada a f.read(): f.read () * If no arguments are passed, then this reads as much data as is outputted by the process, blocking until it reads nothing (i.e. the process has exited). f.read (string) * If a single string is passed, then read() reads up to and including the matching string. Tu llamada f.read() está leyendo hasta que acabe el proceso (smbpasswd). Como a su vez smbpasswd está esperando a que tú le introduzcas un password, ambos procesos esperarán indefinidamente. Está documentado como "error de libro" en el uso del popen2. LLama a f.read con argumento: eg: f.read("word: "). Saludos, - -- Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien PYTANDO http://pytando.sf.net | se contenta con lo que sabe" PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9aW2/HLTQrABk8H0RAgd8AJ9UG6a3a9MpOdoF1Qw61xiD46+UZACgtsh3 sHbhd+dfkgFDfMm2SSyV0vU= =XTEm -----END PGP SIGNATURE----- From fernand0 en hotpop.com Mon Aug 26 20:18:06 2002 From: fernand0 en hotpop.com (fernand0 en hotpop.com) Date: Mon, 26 Aug 2002 20:18:06 +0200 (CEST) Subject: como llamar al __init__ de la clase padre In-Reply-To: <20020808164940.55195.qmail@web20901.mail.yahoo.com> References: <20020808164940.55195.qmail@web20901.mail.yahoo.com> Message-ID: Hola, no me hagas mucho caso, que estoy recién aterrizado de las vacaciones y aún no me aclaro, pero creo que lo que recomiendan es crear un método reset, para casos como este. El método reset puede ser llamado por el __init__ y además manualmente cada vez que sea preciso. Sacado de: http://diveintopython.org/dialect_extract.html Saludos, -- Fernando From hernan en orgmf.com.ar Mon Aug 26 13:11:58 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Mon, 26 Aug 2002 13:11:58 +0200 Subject: como llamar al __init__ de la clase padre In-Reply-To: References: Message-ID: > no me hagas mucho caso, que estoy recién aterrizado de las vacaciones y > aún no me aclaro, pero creo que lo que recomiendan es crear un método > reset, para casos como este. El método reset puede ser llamado por el > __init__ y además manualmente cada vez que sea preciso. pero el ejemplo que señalaste funciona porque el método __init__ de la superclase ya invoca a un metodo reset. class C: def __init__(self): self.reset() def reset(self): pass class D(C): def reset(self): print "mi_reset" d = D() ---> mi_reset pero si no tenemos acceso al codigo de la superclase, y necesitamos que se invoque al metodo __init__ de ella, haríamos: class C: def __init__(self): print "C" class D(C): def __init__(self): C.__init__(self) print "D" d = D() si usamos la nueva estructura de clases de python tenemos el tipo super: class C(object): def __init__(self): print "C" class D(C): def __init__(self): super(D, self).__init__() print "D" d = D() saludos, -H. From miguev en gulic.org Mon Aug 26 18:25:13 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Mon, 26 Aug 2002 17:25:13 +0100 Subject: =?iso-8859-15?Q?Presentaci?= =?iso-8859-15?Q?=F3n?= In-Reply-To: References: <20020824115512.GA443@gulic.org> <20020824131503.GA568@gulic.org> <20020825211925.GA12504@Harry> Message-ID: <20020826162513.GA1819@Harry> On Sun, Aug 25, 2002 at 11:39:16PM +0100, Félix J. Marcelo Wirnitzer wrote: > Según dijo Miguel Ángel Vilela el Dom 25 Ago 2002 22:19, > # On Sat, Aug 24, 2002 at 03:15:03PM +0200, Carlos Mestre González wrote: > # > > > # > > Hay por ahí una web llamada «Useless Python» (algo así como «Python > # > > inútil»), y creo que está traducida. A ver... pues parece que no. La > página # > > original está en http://www.uselesspython.com/ . > # > > # > > # > A vale, me hubiera gustado más en español, bueno, pero con el > # > inglés me defiendo, gracias por tu ayuda. ¿3 guliceros? ¿cuales? > # > A ver si puedo luego hechar una mano con el brocha X). > # > # Parece mentira que no te imaginaras quién sería el tercer gulicero ;-) > # > # Saludetes y bienvenido a la lista. > > Aquí un cuarto gulicero Y creo que hay uno más escondido que no responde ni a los query en el irc ;-) Y hay al menos 5 más que no sé cómo no se han apuntado aún a esta lista... Si seguimos con el ritmo que llevamos acabaremos fundando el GUPIC X-D -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- "Irrigation of the land with sewater desalinated by fusion power is ancient. It's called 'rain'." -- Michael McClary, in alt.fusion ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From miguev en gulic.org Mon Aug 26 18:43:39 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Mon, 26 Aug 2002 17:43:39 +0100 Subject: [SOLUCIONADO] Re: [Python-es] Expect contra smbpasswd In-Reply-To: <200208260152.32018.chemacortes@wanadoo.es> References: <20020825213948.GA12724@Harry> <200208260152.32018.chemacortes@wanadoo.es> Message-ID: <20020826164339.GB1819@Harry> On Mon, Aug 26, 2002 at 01:52:31AM +0200, Chema Cortés wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > El Dom 25 Ago 2002 23:39, Miguel Ángel Vilela escribió: > > Estoy intentando cambiar la clave Samba de un usuario (desde root) con > > el módulo de Expect para Python, pero no me funciona. El código que > > estoy usando es de un ejemplo que trae el paquete python-expect de > > Debian (uso SID): > > > > ----- autopasswd.py ----------------------- > > import sys, time, string > > from expect import * > > > > f = popen2 ("passwd usuario", "p") > > f.read ("word: ") > > time.sleep (0.1) > > f.write ("unaclave\n") > > f.read ("word: ") > > time.sleep (0.1) > > f.write ("unaclave\n") > > print string.strip (f.read ()) > > --------------------------------------------- > > > > Lo único que he cambiado es el comando ejecutado en la tubería, en > > lugar de passwd he puesto smbpasswd, pero parece que no se deja. El > > caso es que se traba la primera llamada al read() Probándolo en el > > > > intérprete se queda indefinidamente en espera: > > >>> import expect > > >>> fd = expect.popen2 ('smbpasswd', 'p') > > >>> fd.read () > > > > (aquí se queda hasta que corto con Control-C) > > > > ¿Qué estoy haciendo mal? Una luz, porfa... > > No tengo el expect para hacer la prueba (justo en este momento está > cerrado sourceforge). Aún así he leido la documentación, y a parte > de cambiar el comando, también has cambiado la llamada a f.read(): > > f.read () > * If no arguments are passed, then this reads as much data as is > outputted by the process, blocking until it reads nothing > (i.e. the process has exited). > > f.read (string) > * If a single string is passed, then read() reads up to and > including the matching string. Por ahí debería empezar (RTFM) ¿Dónde está la documentación? > Tu llamada f.read() está leyendo hasta que acabe el proceso > (smbpasswd). Como a su vez smbpasswd está esperando a que tú le > introduzcas un password, ambos procesos esperarán indefinidamente. > Está documentado como "error de libro" en el uso del popen2. LLama a > f.read con argumento: eg: f.read("word: "). He probado con f.read("word: ") y sucede exactamente lo mismo, se queda indefinidamente a la espera. >>> import expect >>> f = expect.popen2 ("smbpasswd usuario", 'p') >>> f.read ("word: ") ... [unos cuantos cabezazos] ... Ya lo encontré: por algún motivo para que funcione con smbpasswd no sirve f.read ("word: ") sino que hay que leer exactamente lo que smbpasswd imprime. He aquí el código que funciona: >>> import expect >>> f = expect.popen2 ("smbpasswd milogin", 'p') >>> f.read ("New SMB password:") 'New SMB password:' >>> f.write ("miclave\n") 8 >>> f.read ("Retype new SMB password:") '\nRetype new SMB password:' >>> f.write ("miclave\n") 8 >>> f.read () '\n' Gracias por la iluminación sobre f.read() :-) -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- Woodward's Law: A theory is better than its explanation. ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From faraox en gulic.org Mon Aug 26 19:54:15 2002 From: faraox en gulic.org (Carlos Mestre =?iso-8859-1?Q?Gonz=E1lez?=) Date: Mon, 26 Aug 2002 19:54:15 +0200 Subject: [Python-es] =?iso-8859-1?Q?Presentaci?= =?iso-8859-1?Q?=F3n?= In-Reply-To: <20020826162513.GA1819@Harry> References: <20020824115512.GA443@gulic.org> <20020824131503.GA568@gulic.org> <20020825211925.GA12504@Harry> <20020826162513.GA1819@Harry> Message-ID: <20020826175415.GA900@gulic.org> > Y creo que hay uno más escondido que no responde ni a los query en el > irc ;-) Y hay al menos 5 más que no sé cómo no se han apuntado aún a > esta lista... Si seguimos con el ritmo que llevamos acabaremos > fundando el GUPIC X-D > > -- A ver si con un poco de ayuda y con lo que leo aqui puedo ayudar luego en algo en el proyecto brocha!. Sí, me da que vamos a tener que formar otro grupo de Guliceros ke tan enganchados a la serpiente XDD -- <>---------------------------------------------------------------<> <>| Carlos Mestre González -- |<> <>| La Palma - Canarias - España |o_o| |<> <>| |:_/| |<> <>| Y pertenezco al LUG con más marcha, GULIC // \ |<> <>| GULIC(Grupo de Usuarios de Linux de Canarias) (| |) |<> <>| Pásate por nuestra web: http://www.gulic.org /\_ _/\ |<> <>| \__)=(_/ |<> <>---------------------------------------------------------------<> Nunca otra cosa damos con tanta liberalidad como nuestros consejos. -- La Rochefoucauld. (1613-1680) Político y escritor francés. From siosss en hotmail.com Tue Aug 27 11:55:31 2002 From: siosss en hotmail.com ( Sonia ) Date: Tue, 27 Aug 2002 09:55:31 +0000 Subject: [Python-es] listas de cadenas de caracteres Message-ID: Se ha borrado un adjunto en formato HTML... URL: From gari en eibar.org Tue Aug 27 12:27:21 2002 From: gari en eibar.org (Garikoitz Araolaza) Date: Tue, 27 Aug 2002 12:27:21 +0200 Subject: [Python-es] listas de cadenas de caracteres In-Reply-To: Message-ID: <5.0.2.1.0.20020827121614.00aa18a0@212.46.120.81> At 11:55 27/08/02, you wrote: >hola! >necesito ayuda para un sencillo programa q tengo q hacer en python y tengo >dificultad. se trata simplemente, de, realizar una funcionq, a partir de >una lista de cadena de caracteres,devuelva otra lista con aquellas cadenas >que contengan el caracter mas frecuente de la lista inicial. Hmmmm... ésta me la sé! ;-) Pero como supongo que es un ejercicio de clase, te cuento más o menos cómo se podría hacer y luego lo haces tú ;-> - Tienes que conseguir un diccionario de letras en las que se indique cuántas veces aparezca cada letra. El resultado final de esta fase debe ser: frecuencia -> {'a':34, 'b':23, 'c':12.... } o algo así. Para ello, simplemente vas cogiendo letra a letra de cada cadena de la lista y vas contándolos en tu diccionario: if frecuencia.has_key[tu_letra]: frecuencia[tu_letra] = frecuencia[tu_letra] + 1 else: frecuencia[tu_letra] = 1 - Después buscas cuál es la letra con mayor frecuencia. Como no va a haber demasiadas letras, (máximo 28...) pues quizás lo mejor es hacer: letra_max = '' for letra in frecuencia.keys(): if frecuencia[letra] > frecuencia[letra_max]: letra_max = letra - Después sólo tienes que ir buscando en todos los strings la letra letra_max con la función mi_string.find(letra_max) y si el resultado es mayor que -1, señal de que lo ha encontrado, con lo que basta con agregarlos a tu lista final con lista_final.append(mi_string) Seguro que hay formas más optimizadas de hacerlo, pero también serán más liosas... Saludos _________________________________________ Garikoitz Araolaza gari en eibar.org From rabs en dimension-virtual.com Tue Aug 27 12:39:48 2002 From: rabs en dimension-virtual.com (=?iso-8859-1?Q?Ra=FAl?= Alexis Betancort Santana) Date: Tue, 27 Aug 2002 11:39:48 +0100 Subject: =?iso-8859-1?Q?Documentaci=F3?= =?iso-8859-1?Q?n?= o ejemplo sobre python-ldap Message-ID: <20020827103948.GA23179@dimension-virtual.com> Pues eso .. que para un proyecto en el que estoy metido necesito acceder a un servidor ldap desde python, estoy usando el módulo python-ldap (import ldap,ldapurl,etc..) pero la documentación es muy escueta y no hay ejemplos buenos de uso del código, solo un bind simple y ya está .. He estado bucando por FM y tampoco he encontrado apps que usen dicho modulo, para *estudiar* el código. ¿Alguien sabe de alguna app que use de forma mas o menos intensa el modulo ldap de python? Saludos -- _ _ // Raúl A. Betancort Santana /> A Dream is an answer to __ \\ // // question that we don't know (oo) \\ // Dimensión Virtual S.L. // how to ask. / \/ \ // \> A Linux Solution Provider From jujibo en inicia.es Tue Aug 27 12:58:28 2002 From: jujibo en inicia.es (Julio =?iso-8859-1?q?Jim=E9nez?=) Date: Tue, 27 Aug 2002 12:58:28 +0200 Subject: [Python-es] listas de cadenas de caracteres In-Reply-To: References: Message-ID: Hola, Unknown ¿cual es el problema?, espones los requisitos pero no las dudas que tienes, o... quieres que te mandemos la función hecha. El problema es muy fácil de resolver. Recorres la lista :) Creas un diccionario ... que contendrá los caracteres y un número que será incrementado por cada aparición en la cadena... Para cada elemento de la lista.... compruebas si está en el diccionario... (si no lo añades) Incrementas el contador... al final obtendrás un diccionario que contendrá todos los caracteres que se han utilizado, es cuestión de buscar el contador más alto... y devolver el elemento del diccionario... :) El desarrollo en Python lo dejo para tí.... Nota: He notado q te fallan algunas teclas ... aquí no q esta dinero enviar mensajes... je je :> Un saludo... Julio Jiménez On Tuesday 27 August 2002 11:55, you wrote: > hola! necesito ayuda para un sencillo programa q tengo q hacer en python y > tengo dificultad. se trata simplemente, de, realizar una funcionq, a partir > de una lista de cadena de caracteres,devuelva otra lista con aquellas > cadenas que contengan el caracter mas frecuente de la lista > inicial. gracias! > > > Charle con sus amigos online usando MSN Messenger: Haga clic aquí From jujibo en inicia.es Tue Aug 27 13:00:25 2002 From: jujibo en inicia.es (Julio =?iso-8859-1?q?Jim=E9nez?=) Date: Tue, 27 Aug 2002 13:00:25 +0200 Subject: [Python-es] listas de cadenas de caracteres In-Reply-To: References: Message-ID: Perdona Sonia :< (en el mensaje anterior donde pone unKnown lease Sonia...) From hernan en orgmf.com.ar Tue Aug 27 13:22:44 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 27 Aug 2002 13:22:44 +0200 Subject: [Python-es] =?iso-8859-1?Q?RE:_Documentaci=F3n_o_ejemplo_sobre_python-ldap?= In-Reply-To: <20020827103948.GA23179@dimension-virtual.com> Message-ID: > He estado bucando por FM y tampoco he encontrado apps que usen dicho > modulo, para *estudiar* el código. ¿Alguien sabe de alguna app que use > de forma mas o menos intensa el modulo ldap de python? hace ya algun tiempo use web2ldap http://www.web2ldap.de/ supongo que mejoro bastante con el tiempo. :-) lo usaba como interfaz web para acceder a un BD ldap. no se si será demasiado para lo que vos querés, pero que hace uso intensivo de la biblioteca no queda duda. -H. From chemacortes en wanadoo.es Tue Aug 27 15:34:38 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-1?q?Cort=E9s?=) Date: Tue, 27 Aug 2002 15:34:38 +0200 Subject: listas de cadenas de caracteres In-Reply-To: <5.0.2.1.0.20020827121614.00aa18a0@212.46.120.81> References: <5.0.2.1.0.20020827121614.00aa18a0@212.46.120.81> Message-ID: <200208271534.39003.chemacortes@wanadoo.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El Mar 27 Ago 2002 12:27, Garikoitz Araolaza escribió: > - Después buscas cuál es la letra con mayor frecuencia. Como no va a haber > demasiadas letras, (máximo 28...) pues quizás lo mejor es hacer: > > letra_max = '' > for letra in frecuencia.keys(): > if frecuencia[letra] > frecuencia[letra_max]: > letra_max = letra Hay un método mejor: letra_max=max(frecuencia) Funciona con diccionarios y todo objeto que tenga el método __cmp__. Saludos, - -- Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien PYTANDO http://pytando.sf.net | se contenta con lo que sabe" PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9a3/uHLTQrABk8H0RAkdCAKDVNoLYQTbN7D8Ai1LZseGkTtbbnACg104V UYS+aTNyRGqkTsAjUwGVvho= =H5rU -----END PGP SIGNATURE----- From hernan en orgmf.com.ar Tue Aug 27 16:13:32 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 27 Aug 2002 16:13:32 +0200 Subject: listas de cadenas de caracteres In-Reply-To: <200208271534.39003.chemacortes@wanadoo.es> References: <200208271534.39003.chemacortes@wanadoo.es> Message-ID: > > - Después buscas cuál es la letra con mayor frecuencia. Como no > > va a haber demasiadas letras, (máximo 28...) pues quizás lo mejor > > es hacer: > > > > letra_max = '' > > for letra in frecuencia.keys(): > > if frecuencia[letra] > frecuencia[letra_max]: > > letra_max = letra > > Hay un método mejor: > > letra_max=max(frecuencia) en diccionarios max() se aplica sobre las claves. en este ejemplo devuelve la letra mas alta (en ascii) y no la letra cuya frecuencia sea la mayor. -H. From zoso en demiurgo.org Tue Aug 27 18:34:05 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Tue, 27 Aug 2002 17:34:05 +0100 Subject: =?iso-8859-1?Q?Bater=EDas?= de pruebas Message-ID: <20020827163404.GA931@demiurgo.org> Hola a todos. ¿Cuántos guliqueros hay aquí ya? ¿cinco? :-) Estoy intentando usar el módulo unittest de Python para hacer pruebas automáticas. El uso en sí de las clases está más o menos claro, y de todas maneras hay un montón de documentación al respecto. Mis dudas van por otros derroteros: ¿Dónde se ponen los ficheros con las pruebas? En Perl se ponen en el directorio t/, pero da problemas en Python, porque al ejecutar programas que están en un directorio pero que usan módulos que están en otro, no los encuentra :-( Puedo ejecutarlos con: PYTHONPATH=. python t/prueba.py pero me parece un poco chapuza. ¿Hay alguna manera mejor? A simple vista, me ha parecido que no se preocupan en la documentación de ese problema (parece que dan por sentado que vas a mezclar en el mismo directorio las pruebas y el programa en sí). Y la segunda duda: ¿cómo se ejecutan las pruebas? De nuevo, en Perl (es el que conozco) se ejecutan todas automáticamente al hacer «make test» en un Makefile hecho con el módulo para escribir extensiones al lenguaje (el ExtUtils::MakeMaker). Es una forma muy cómoda y conveniente de ejecutar todas las pruebas de golpe, y no veo una manera de hacer lo mismo con unittest. ¿Hay que ejecutar cada una a mano o qué? ¿? Saludos pitonianos-camelliles, -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From amaya en debian.org Tue Aug 27 19:40:16 2002 From: amaya en debian.org (Amaya) Date: Tue, 27 Aug 2002 19:40:16 +0200 Subject: [Python-es] Error con array Message-ID: <20020827174016.GA4341@aenima> Tengo un script cuya misión es analizar logs de iptables en una máquina que balancea la carga a otras cuatro que tiene detrás. Se trata de saber cuándo entra una petición y cuándo sale la respuesta para hacer un poco de benchmark y saber qué tipo de peticiones tardan más. El script anda en http://amayita.com/~amaya/python/ donde encontraréis un tar.bz2 por si os queréis bajar también un log de ejemplo. No he querido adjuntarlo a este correo por los tamaños. Por simplificar un poco, en prueba.py está la parte del script que me falla, por si a alguno os suena el mensaje de error: Traceback (most recent call last): File "prueba.py", line 24, in ? print pattern.group(1)[4:], line_num AttributeError: 'NoneType' object has no attribute 'group' El script ya va casi encaminado, y todo gracias a vuestras sugerencias y observaciones... Este script me funciona bien en una Mandrake, pero en mi Debian me falla: Traceback (most recent call last): File "./prueba.py", line 6, in ? my_file = file('amaya', 'r') NameError: name 'file' is not defined Versiones de Python: ~-arodrigo en cuelebre>rpm -qa | grep python # -----> Mi Mandrake python-imaging-1.1.2-4mdk python-2.2.1-4mdk python-numeric-20.3-2mdk libpython2.2-2.2.1-4mdk rpm-python-4.0.4-13mdk python-base-2.2.1-4mdk ~-amaya en aenima>dpkg -l | grep python # -----> Mi Debian ii python 2.1.3-6a An interactive object-oriented scripting lan ii python-numeric 21.3-1 Numerical (matrix-oriented) Mathematics for ii python-numeric 21.3-1 Extension modules for Numeric Python ii python1.5-base 1.5.2-18.4 An interactive object-oriented scripting lan ii python2.1 2.1.3-6a An interactive object-oriented scripting lan ii python2.1-nume 21.3-1 Numerical (matrix-oriented) Mathematics for ii python2.1-nume 21.3-1 Extension modules for Numeric Python ii python2.2 2.2.1-8 An interactive object-oriented scripting lan ii python2.2-nume 21.3-1 Numerical (matrix-oriented) Mathematics for ii python2.2-nume 21.3-1 Extension modules for Numeric Python ii python2.2-opti 1.3-5 advanced command-line parsing library for Py ~-amaya en aenima>ls -l /usr/bin/python lrwxrwxrwx 1 root root 9 2002-08-27 18:50 /usr/bin/python -> python2.1 ~-amaya en aenima>/usr/bin/python2.2 prueba.py No falla, es increíble. ~-amaya en aenima>/usr/bin/python2.1 prueba.py Traceback (most recent call last): File "prueba.py", line 6, in ? my_file = file('amaya', 'r') NameError: name 'file' is not defined ¿Me conviene usar 2.1 o 2.2? Gracias de nuevo :-) -- .''`. Life is WYGIWYD: What You Get Is What You Deserve : :' : `. `' Proudly running Debian GNU/Linux Sid (2.4.18 + Ext3) `- www.amayita.com www.malapecora.com www.chicasduras.com From pabloruiz en gnu.org Tue Aug 27 20:45:58 2002 From: pabloruiz en gnu.org (Pablo Ruiz =?ISO-8859-1?B?Tfp6cXVpeg==?=) Date: Tue, 27 Aug 2002 20:45:58 +0200 Subject: [Python-es] Error con array In-Reply-To: <20020827174016.GA4341@aenima> References: <20020827174016.GA4341@aenima> Message-ID: <20020827204558.54e25c16.pabloruiz@gnu.org> El Tue, 27 Aug 2002 19:40:16 +0200 Amaya escribió: > ¿Me conviene usar 2.1 o 2.2? Creo que 'file' era una de las novedades de python2.2 (anteriormente se usaba open()) Yo te recomiendo usar python2.2 por las mejoras que trae. Hay cosas que no te funcionarán en python2.1 pero creo que merece la pena (lo que no recomiendo nada es 1.5.2 a estas alturas). Sobre tu programa, no tengo tiempo libre para verlo. espero que alguien te pueda ayudar. -- Pablo Ruiz Múzquiz pabloruiz en gnu.org :: http://elenya.net --------------------------------------- KEY FINGERPRINT -> 2BB2 E013 3137 DB03 878C 14D3 B95D 3DD2 17B0 0619 GPG -> http://elenya.net/pabloruiz --------------------------------------- From hernan en orgmf.com.ar Tue Aug 27 20:24:37 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 27 Aug 2002 20:24:37 +0200 Subject: [Python-es] Error con array In-Reply-To: <20020827174016.GA4341@aenima> Message-ID: > Este script me funciona bien en una Mandrake, pero en mi Debian me > falla: > > Traceback (most recent call last): > File "./prueba.py", line 6, in ? > my_file = file('amaya', 'r') > NameError: name 'file' is not defined > ............. > ~-amaya en aenima>/usr/bin/python2.1 prueba.py > Traceback (most recent call last): > File "prueba.py", line 6, in ? > my_file = file('amaya', 'r') > NameError: name 'file' is not defined file es un nuevo objeto que está presente en la 2.2 antes se usaba open, que ahora es un alias a file. > > ¿Me conviene usar 2.1 o 2.2? depende. se puedo elegir libremente me quedo con la 2.2 esa versión va a ser mantenida por varios meses mas aun despues de que aparezca la 2.3 pero vos tendrás que evaluar cómo son los entornos de producción y cuál es el coste de unificar esos entornos a 2.2 para este error especifico, basta con cambiar file por open y ya esta. pero puede que tengas otros problemas en el programa. por ejemplo, cambiar: my_file = file('amaya', 'r') for lineas in my_file: ... etc ... a: my_file = open('amaya', 'r') for lineas in my_file.readline(): ... etc... -Hernan From hernan en orgmf.com.ar Tue Aug 27 20:46:31 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Tue, 27 Aug 2002 20:46:31 +0200 Subject: Error con array In-Reply-To: <20020827174016.GA4341@aenima> References: <20020827174016.GA4341@aenima> Message-ID: > Por simplificar un poco, en prueba.py está la parte del script que me > falla, por si a alguno os suena el mensaje de error: > > Traceback (most recent call last): > File "prueba.py", line 24, in ? > print pattern.group(1)[4:], line_num > AttributeError: 'NoneType' object has no attribute 'group' ahora estoy Windows y no puedo abrir el .tbz2 pero por el mensaje de error seguro que lo que paso es que el search de la expresion regular no encontró nada. saludos, -hernan From zoso en demiurgo.org Tue Aug 27 20:56:04 2002 From: zoso en demiurgo.org (Esteban Manchado =?iso-8859-1?Q?Vel=E1zquez?=) Date: Tue, 27 Aug 2002 19:56:04 +0100 Subject: Error con array In-Reply-To: <20020827174016.GA4341@aenima> References: <20020827174016.GA4341@aenima> Message-ID: <20020827185604.GE931@demiurgo.org> On Tue, Aug 27, 2002 at 07:40:16PM +0200, Amaya wrote: > [...] > Por simplificar un poco, en prueba.py está la parte del script que me > falla, por si a alguno os suena el mensaje de error: > > Traceback (most recent call last): > File "prueba.py", line 24, in ? > print pattern.group(1)[4:], line_num > AttributeError: 'NoneType' object has no attribute 'group' Tengo bastante poca idea de Python (por ahora), pero parece que está diciendo que «pattern» vale «None», ¿no? Creo que «NoneType» es el tipo del valor «None» (y «None» es el único objeto que pertenece a ese tipo). Por hacer una suposición salvaje, ¿podría ser que «pattern» fuera el resultado de una búsqueda *infructuosa* con expresiones regulares? Lo del «file» ya te lo han resuelto, así que sólo comentarte que la versión «oficial» de Python para Woody es la 2.1 (es la versión a la que apunta /usr/bin/python, como ya viste). Si necesitas usar una versión específica (en Debian o en cualquier otro lado), pon al principio del fichero #!/usr/bin/python2.2 en vez de simplemente «/usr/bin/python». -- Esteban Manchado Velázquez - http://www.demiurgo.org No software patents in Europe! - freepatents.org - proinnova.hispalinux.es Join Amnesty International - http://www.amnesty.org/actnow ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From floro en aditel.org Tue Aug 27 21:13:58 2002 From: floro en aditel.org (=?ISO-8859-1?Q?Pedro_Floro_Garc=EDa?=) Date: Tue, 27 Aug 2002 21:13:58 +0200 (CEST) Subject: [Python-es] Cambio administrador lista Python Message-ID: Hola, Queria informar a la lista que dejo de ser uno de los 3 administradores, y que en lugar mio esta Enrique Dealbert (dealbert en aditel.org). Ya sabeis, si teneis alguna duda o algun problema podeis contactar con cualquiera de los 3 administradores. Saludos. -- #~~~~#~~~~#~~~~#~~~~#~~~~#~~~~#~~~~#~~~~# ____ Pedro Foro Garcia - LANCELOT | | floro en aditel.org | O Ing. Tec. en Inf. de Gestion | /|\ | / \ - ¿Como esta el tiempo? |____ - Si. |_ |________________________________ From dealbert en aditel.org Tue Aug 27 21:24:43 2002 From: dealbert en aditel.org (Enrique Dealbert Garcia) Date: Tue, 27 Aug 2002 21:24:43 +0200 (CEST) Subject: Cambio administrador lista Python In-Reply-To: References: Message-ID: El día 27/08/02, Pedro Floro García escribió: > Hola, > > Queria informar a la lista que dejo de ser uno de los 3 > administradores, y que en lugar mio esta Enrique Dealbert > (dealbert en aditel.org). > Ya sabeis, si teneis alguna duda o algun problema podeis > contactar con cualquiera de los 3 administradores. > > Saludos. pos eso que si necesitais algo ya sabeis. salut! -- ################################### Enrique Dealbert Garcia onek e-mail: dealbert en aditel.org ################################### From siosss en hotmail.com Tue Aug 27 11:47:45 2002 From: siosss en hotmail.com ( Sonia ) Date: Tue, 27 Aug 2002 09:47:45 +0000 Subject: python Message-ID: Se ha borrado un adjunto en formato HTML... URL: From chemacortes en wanadoo.es Wed Aug 28 13:56:12 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-1?q?Cort=E9s?=) Date: Wed, 28 Aug 2002 13:56:12 +0200 Subject: [Python-es] listas de cadenas de caracteres In-Reply-To: References: Message-ID: <200208281356.15630.chemacortes@wanadoo.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 El Mar 27 Ago 2002 16:13, Hernan Martinez Foffani escribió: > > > - Después buscas cuál es la letra con mayor frecuencia. Como no > > > va a haber demasiadas letras, (máximo 28...) pues quizás lo mejor > > > es hacer: > > > > > > letra_max = '' > > > for letra in frecuencia.keys(): > > > if frecuencia[letra] > frecuencia[letra_max]: > > > letra_max = letra > > > > Hay un método mejor: > > > > letra_max=max(frecuencia) > > en diccionarios max() se aplica sobre las claves. > en este ejemplo devuelve la letra mas alta (en ascii) > y no la letra cuya frecuencia sea la mayor. Cierto. Se nota que ayer no tuve un buen día :-S La solución debería también considerar que varias letras pueden tener la misma frecuencia. Algo tal que así: m=0 letras_max=[] for letra in frecuencia.keys(): if frecuencia[letra] > m: m=frecuencia[letra] letras_max=[letra] # olvidamos lo que hubiera hasta ahora elif frecuencia[letra]==m: letras_max.append(letra) Algo más conciso, pero menos legible: m=max(frecuencia.values()) letras_max=filter(lambda x: frecuencia[x]==m, frecuencia.keys()) o, mi versión preferida para buscar claves en diccionarios: m=max(frecuencia.values()) letras_max=[k for k,v in frecuencia.items() if v==m] Saludos, - -- Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien PYTANDO http://pytando.sf.net | se contenta con lo que sabe" PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9bLpfHLTQrABk8H0RAg3PAKDCqT+vE03N/g5Ap3ertzBO11ksSQCg+9Wy 4umGQEo73zxsdYKjrpDYYcU= =NYZ0 -----END PGP SIGNATURE----- From mostroratas en yahoo.es Wed Aug 28 20:38:46 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Wed, 28 Aug 2002 20:38:46 +0200 (CEST) Subject: Consultas a DNS y Tabla de rutage In-Reply-To: References: Message-ID: <20020828183846.97173.qmail@web20903.mail.yahoo.com> --- Hernan Martinez Foffani escribió: > ¿estás usando PyDNS? > http://pydns.sf.net > > -Hernan Pues gracias a tu consejo (no tenia ni idea de existia eso), si, me lo he bajado y me he leido las 40!!! lineas de documentacion que tiene (que dice que terminara pero que...), con dos o tres ejemplos y unos ficheros de test, tb. he probado a hacer algo usando el modulo socket, pero me sigo teniendo un problema, pq conel PyDNS necesito pasarle el dominio y yo quisiera saber si se puede hacer eso sin aber el dominio en el que estas. La idea es que si es un programa de configuracion, que el mismo sea capaz de encontrar el dominio en el que esta. Sabre la IP, porque al menos eso se puede sacar con el modulo socket, pero como encuentro la red en la que estoy. Bueno, si alguien sabe algo de esto, que me lo diga por favor, si no, intentare encontrar algun truquillo o hacerlo a mano. Un saludo, Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From aerd en retemail.es Wed Aug 28 20:08:22 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Wed, 28 Aug 2002 20:08:22 +0200 Subject: [Python-es] =?iso-8859-15?Q?Re:_=5BPython-es=5D_Evoluci=F3n_din=E1mica_de_los_objetos_?= =?iso-8859-15?Q?a_diferentes_clases?= References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> <1030287154.1976.6.camel@foleys> Message-ID: <008101c24ec4$ecbb7560$0100a8c0@sicem.biz> Arkaitz, gracias, acabo de ver el ejemplo en el libro que estoy leyendo 'Object Primer 2nd' de Scot Ambler que realmente puedo recomendar si alguien quiere conocer o profundizar en el desarrollo orientado a objetos. Aunque pueda parecer una introducción, el arte del libro es que es muy didáctico y que además enlaza las diferentes técnicas para crear un método de desarrollo. ¿Me podéis recomendar algún libro de 'analysis patterns' o 'design patterns' ? Como aprender siempre es bueno, los 'patterns' o en español 'patrones' son soluciones a problemas conocidos. Solamente se expresa la idea y pero no usa ningún lenguaje de programación concreto. Saludos, Erny ----- Original Message ----- From: "Arkaitz Bitorika" To: Sent: Sunday, August 25, 2002 4:52 PM Subject: Re: [Python-es] Evolución dinámica de los objetos a diferentes clases > Ernesto, > > Has pensado en usar el design pattern ("patron de diseino"?) "State"? Es > basicamente la idea que dio Antoni de utilizar roles, o cierto estado > asociado con cada instancia de Persona. De esta manera, cuando cambies > el estado o rol de Cliente a Proveedor o lo que sea, cambias solo esa > asociacion. > Este patron esta explicado muy bien en Design Patterns por Gamma et al. > > saludos, > Arkaitz > > On Thu, 2002-08-22 at 18:50, Ernesto Revilla wrote: > > Hola, > > > > no tiene que ver directamente con Python, más bien con programación > > orientado a objeto. > > > > Suponed que hay una clase Persona y otras dos clases que heredan de allí, > > Cliente y Proveedor. > > > > 1. ¿Cómo puede modelarse que un objeto 'evoluciona' de un la a otro, por > > ejemplo, Persona evoluciona a ser Cliente. > > ¿se puede cambiar la clase de un objeto dinámicamente? > > (ya sé que se puede borrar y crear un objeto nuevo de la otra clase, ¿hay > > otra manera?) > > > > 2. ¿Cómo podría hacerse que un objeto Cliente evolucionase a una clase > > Proveedor? (Es decir, una clase que no está en la rama de la clase actual > > del árbol de herencia.) > > > > 3. He visto alguna vez algo como esto: > > C.__bases__.append(D) # siendo C clase y D clase > > > > Aunque no resuelva el tema de 1. y 2., me parecía interesante, poder > > enriquecer la funcionalidad de una clase, agregandole clases bases. > > > > Respecto a 1. y 2. hemos llegado a la conclusión modelarlo de otra manera: > > crear clases Persona, DatosCliente y DatosProveedor, y hacer que Persona > > tenga una referencia opcional a cada uno. Si una persona nos compra algo y > > no tiene parte de cliente, esta es creada y asociada. Preguntar si un > > persona es cliente coincide con mirar si tiene una parte de datos de > > cliente. > > > > ¿Por qué me importa eso? Por el tema de la persistencia. El tema de dejar > > evolucionar dinámicamente a los objetos, me crea ciertos trastornos a la > > hora de las actualizaciones. > > > > Saludos, > > Erny > > > > > > > > > > > > > > > > > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From aerd en retemail.es Wed Aug 28 20:12:40 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Wed, 28 Aug 2002 20:12:40 +0200 Subject: Error con array References: Message-ID: <008201c24ec4$ee3ae970$0100a8c0@sicem.biz> Quizá sería una propuesta poner una comprobación de versión al principio y si <2.2: file=open ¿Sirve para algo? Erny ----- Original Message ----- From: "Hernan Martinez Foffani" To: Sent: Tuesday, August 27, 2002 8:24 PM Subject: RE: [Python-es] Error con array > > Este script me funciona bien en una Mandrake, pero en mi Debian me > > falla: > > > > Traceback (most recent call last): > > File "./prueba.py", line 6, in ? > > my_file = file('amaya', 'r') > > NameError: name 'file' is not defined > > ............. > > ~-amaya en aenima>/usr/bin/python2.1 prueba.py > > Traceback (most recent call last): > > File "prueba.py", line 6, in ? > > my_file = file('amaya', 'r') > > NameError: name 'file' is not defined > > file es un nuevo objeto que está presente en la 2.2 > antes se usaba open, que ahora es un alias a file. > > > > > ¿Me conviene usar 2.1 o 2.2? > > depende. se puedo elegir libremente me quedo con la 2.2 > esa versión va a ser mantenida por varios meses mas aun > despues de que aparezca la 2.3 > > pero vos tendrás que evaluar cómo son los entornos > de producción y cuál es el coste de unificar esos > entornos a 2.2 > > para este error especifico, basta con cambiar > file por open y ya esta. pero puede que tengas otros > problemas en el programa. por ejemplo, cambiar: > > my_file = file('amaya', 'r') > for lineas in my_file: > ... etc ... > a: > > my_file = open('amaya', 'r') > for lineas in my_file.readline(): > ... etc... > > -Hernan > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From aerd en retemail.es Wed Aug 28 20:35:43 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Wed, 28 Aug 2002 20:35:43 +0200 Subject: Hay tipo de datos abstracto 'conjunto' References: Message-ID: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> Hola, quizá sea una tontería, per la verdad es que me vendría muy bien tener conjunto o en ingléd 'set' para tener cada elemento sólo una vez. ¿Hay algo así en Python? Me extraña que no estuviese porque sí hay dictionarios y listas, estas últimas incluso pueden servir de pilas y de fifos. Ya sé que no es difícil definirlo construirlo a partir de una lista, pero tengo que redefinir 'append', 'extend' y ¿qué pasa con __add__ y __mul__ y todos esos? class set(list): def append(self, element): if not element in self: list.append(self,element) def extend(self,elements): for element in elements: self.append(element) def __iadd__(self,elements): self.extends(elements) return self ¿Qué más habría que hacer? Erny From mostroratas en yahoo.es Wed Aug 28 21:12:43 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Wed, 28 Aug 2002 21:12:43 +0200 (CEST) Subject: Hay tipo de datos abstracto 'conjunto' In-Reply-To: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> References: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> Message-ID: <20020828191243.86365.qmail@web20904.mail.yahoo.com> --- Ernesto Revilla escribió: > Hola, > > quizá sea una tontería, per la verdad es que me vendría muy bien tener > conjunto o en ingléd 'set' para tener cada elemento sólo una vez. > > ¿Hay algo así en Python? yo que soy un principiante no he entendido que es lo que quieres realmente, pq en un diccionario de las letras del abedecedario, no podras meter dos veces 'a', solo una vez, y asi podras contabilizar el numero de veces que hay, como se ha dicho en el problema de... silvia?, en las listas si que puedes tener elementos repetidos, pero en los diccionarios, puedes mirarlo con el has_key si esta o no y si directamente lo inssertas, asignaras el nuevo valor al que ya existiera de antes si dicha clave ya existia. Asi que lo dicho, no he comprendido tu duda, lo siento :( Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From miguev en gulic.org Thu Aug 29 04:39:00 2002 From: miguev en gulic.org (Miguel =?iso-8859-15?Q?=C1ngel?= Vilela) Date: Thu, 29 Aug 2002 03:39:00 +0100 Subject: [Python-es] Hay tipo de datos abstracto 'conjunto' In-Reply-To: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> References: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> Message-ID: <20020829023900.GA13895@Harry> On Wed, Aug 28, 2002 at 08:35:43PM +0200, Ernesto Revilla wrote: > Hola, > > quizá sea una tontería, per la verdad es que me vendría muy bien tener > conjunto o en ingléd 'set' para tener cada elemento sólo una vez. > > ¿Hay algo así en Python? > > Me extraña que no estuviese porque sí hay dictionarios y listas, estas > últimas incluso pueden servir de pilas y de fifos. > > Ya sé que no es difícil definirlo construirlo a partir de una lista, pero > tengo que redefinir 'append', 'extend' y ¿qué pasa con __add__ y __mul__ y > todos esos? Una sugerencia de mente matemática: si A y B son conjuntos, A + B es la unión y A * B es la intersección. Esto viene de que operando en binario + es OR y * es AND, y OR es la unión y AND es la intersección. No creo que te sirva de mucho ;-P Saludos. -- --==-- --==-- Miguel Ángel Vilela --==-- --==-- a.k.a miguev at fmat.ull.es, GULiC, Barrapunto & IRC-Hispano GULiC - Grupo de Usuarios Linux de Canarias - http://www.gulic.org Facultad de Matemáticas, Universidad La Laguna --- www.fmat.ull.es Public GPG key at http://search.keyserver.net (search for: miguev) Linux Reg. User #184518 - Debian GNU/Linux SID - kernel 2.4.18-xfs Linux Reg. Machines: #81674, #81677, #105478, #118020, #118022 -- Linux Driver Petition #73209 --- No ePatents Petition #80354 -- * joeyh_ wonders if linux is supposed to lock up when you ask 100 processes to cat the entire cd drive ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: application/pgp-signature Size: 189 bytes Desc: no disponible URL: From antonio.beamud en agora-2000.com Thu Aug 29 08:33:39 2002 From: antonio.beamud en agora-2000.com (Antonio Beamud Montero) Date: 29 Aug 2002 08:33:39 +0200 Subject: [Python-es] Re: [Python-es] =?ISO-8859-1?Q?Evoluci=F3n?= =?ISO-8859-1?Q?_din=E1mica?= de los objetos a diferentes clases In-Reply-To: <008101c24ec4$ecbb7560$0100a8c0@sicem.biz> References: References: <001a01c24a04$7918fac0$0100a8c0@sicem.biz> <1030287154.1976.6.camel@foleys> <008101c24ec4$ecbb7560$0100a8c0@sicem.biz> Message-ID: <1030602820.797.2.camel@praga.agora-2000.com> Thinking in Python (http://www.mindview.net/Books/TIPython) Salu2 El mié, 28-08-2002 a las 20:08, Ernesto Revilla escribió: > Arkaitz, gracias, > > acabo de ver el ejemplo en el libro que estoy leyendo 'Object Primer 2nd' de > Scot Ambler que realmente puedo recomendar si alguien quiere conocer o > profundizar en el desarrollo orientado a objetos. Aunque pueda parecer una > introducción, el arte del libro es que es muy didáctico y que además enlaza > las diferentes técnicas para crear un método de desarrollo. > > ¿Me podéis recomendar algún libro de 'analysis patterns' o 'design patterns' > ? > > Como aprender siempre es bueno, los 'patterns' o en español 'patrones' son > soluciones a problemas conocidos. Solamente se expresa la idea y pero no usa > ningún lenguaje de programación concreto. > > Saludos, Erny > > ----- Original Message ----- > From: "Arkaitz Bitorika" > To: > Sent: Sunday, August 25, 2002 4:52 PM > Subject: Re: [Python-es] Evolución dinámica de los objetos a diferentes > clases > > > > Ernesto, > > > > Has pensado en usar el design pattern ("patron de diseino"?) "State"? Es > > basicamente la idea que dio Antoni de utilizar roles, o cierto estado > > asociado con cada instancia de Persona. De esta manera, cuando cambies > > el estado o rol de Cliente a Proveedor o lo que sea, cambias solo esa > > asociacion. > > Este patron esta explicado muy bien en Design Patterns por Gamma et al. > > > > saludos, > > Arkaitz > > > > On Thu, 2002-08-22 at 18:50, Ernesto Revilla wrote: > > > Hola, > > > > > > no tiene que ver directamente con Python, más bien con programación > > > orientado a objeto. > > > > > > Suponed que hay una clase Persona y otras dos clases que heredan de > allí, > > > Cliente y Proveedor. > > > > > > 1. ¿Cómo puede modelarse que un objeto 'evoluciona' de un la a otro, por > > > ejemplo, Persona evoluciona a ser Cliente. > > > ¿se puede cambiar la clase de un objeto dinámicamente? > > > (ya sé que se puede borrar y crear un objeto nuevo de la otra clase, > ¿hay > > > otra manera?) > > > > > > 2. ¿Cómo podría hacerse que un objeto Cliente evolucionase a una clase > > > Proveedor? (Es decir, una clase que no está en la rama de la clase > actual > > > del árbol de herencia.) > > > > > > 3. He visto alguna vez algo como esto: > > > C.__bases__.append(D) # siendo C clase y D clase > > > > > > Aunque no resuelva el tema de 1. y 2., me parecía interesante, poder > > > enriquecer la funcionalidad de una clase, agregandole clases bases. > > > > > > Respecto a 1. y 2. hemos llegado a la conclusión modelarlo de otra > manera: > > > crear clases Persona, DatosCliente y DatosProveedor, y hacer que Persona > > > tenga una referencia opcional a cada uno. Si una persona nos compra algo > y > > > no tiene parte de cliente, esta es creada y asociada. Preguntar si un > > > persona es cliente coincide con mirar si tiene una parte de datos de > > > cliente. > > > > > > ¿Por qué me importa eso? Por el tema de la persistencia. El tema de > dejar > > > evolucionar dinámicamente a los objetos, me crea ciertos trastornos a la > > > hora de las actualizaciones. > > > > > > Saludos, > > > Erny > > > > > > > > > > > > > > > > > > > > > > > > > > > _______________________________________________ > > > Python-es mailing list > > > Python-es en aditel.org > > > http://listas.aditel.org/listinfo.py/python-es > > > > > > _______________________________________________ > > Python-es mailing list > > Python-es en aditel.org > > http://listas.aditel.org/listinfo.py/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es -- Microsoft merges technologoies: Windows CE + Windows ME + Windows NT = Windows CEMENT ---- Antonio Beamud Montero Agora Systems S.A. http://www.agoratechnologies.com From siosss en hotmail.com Thu Aug 29 10:33:06 2002 From: siosss en hotmail.com ( Sonia ) Date: Thu, 29 Aug 2002 08:33:06 +0000 Subject: continuo con las listas de cadenas de caracteres Message-ID: Se ha borrado un adjunto en formato HTML... URL: From hernan en orgmf.com.ar Thu Aug 29 10:50:26 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 10:50:26 +0200 Subject: [Python-es] =?iso-8859-15?Q?RE:_Evoluci=F3n_din=E1mica_de_los_objetos_a_diferentes_cla?= =?iso-8859-15?Q?ses?= In-Reply-To: <008101c24ec4$ecbb7560$0100a8c0@sicem.biz> Message-ID: > ¿Me podéis recomendar algún libro de 'analysis patterns' o > 'design patterns' ? 'Design Patterns. Elements of Reusable Object-Oriented Software' (el original) de Gamma, Helm, Johnson y Vlissdes lo pueden encontrar en España. Ese es el libro al se suele referir como GoF (Gang of Four, banda de los cuatro) En Madrid lo compré en la librería Informatica y Comunicaciones. Es cariiiitoooo (tiene tapa dura). Saludos, -H. From hernan en orgmf.com.ar Thu Aug 29 11:00:46 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 11:00:46 +0200 Subject: Error con array In-Reply-To: <008201c24ec4$ee3ae970$0100a8c0@sicem.biz> References: <008201c24ec4$ee3ae970$0100a8c0@sicem.biz> Message-ID: > Quizá sería una propuesta poner una comprobación de versión al principio y > si <2.2: > file=open > > ¿Sirve para algo? el problema es que no solo fue un cambio de nombres. file incluye todo (creo) lo que tenía open, pero agrega otras propiedades. de hecho, open era una funcion, y file es un constructor. por eso si el programa escrito para 2.2 hace uso de otras funcionalidades de file no va a andar en versiones anteriores. lo mas probable es que quien haya hecho uso de "f = file(..)" para acceder a ficheros casi seguro que uso la construccion "for linea in f:" en ese caso tu propuesta no soluciona el problema. ahora, si uno tiene un programa escrito para 2.2 y falla al correr en 2.1 por lo de file, es muy facil agregar al principio la sentencia que propones e intentarlo. quizás eso sea suficiente. -Hernan From hernan en orgmf.com.ar Thu Aug 29 11:21:36 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 11:21:36 +0200 Subject: Hay tipo de datos abstracto 'conjunto' In-Reply-To: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> References: <008301c24ec4$f7d0fba0$0100a8c0@sicem.biz> Message-ID: > quizá sea una tontería, per la verdad es que me vendría muy bien tener > conjunto o en ingléd 'set' para tener cada elemento sólo una vez. ¿tonteria? nooooo... hubo varias propuestas de agregar conjuntos como tipo de datos a python. hasta hace unos días todas las implementaciones habían sido rechazadas. > ¿Hay algo así en Python? hay un 99% de probabilidad que haya una implementacion oficial de conjuntos en la 2.3 está escrita en python. pueden ir haciendo uso de ella en: http://cvs.sf.net/cgi-bin/viewcvs.cgi/*checkout*/python/python/dist/src/Lib/ sets.py?rev=HEAD&content-type=text/plain (cambien plain por x-python para que descargue en vez que aparezca en el navegador) > ... > ¿Qué más habría que hacer? union, intereseccion, substraccion, esta_incluido_en, incluye_a, conjunto_de_los_subconjuntos, pertenencia, etc. prueba con el url que te pasé que el modulo es muy completo. en la lista de python-dev están pidiendo feedback de ese modulo ahora. es nuevito nuevito. saludos, -Hernan From hernan en orgmf.com.ar Thu Aug 29 11:37:43 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 11:37:43 +0200 Subject: Consultas a DNS y Tabla de rutage In-Reply-To: <20020828183846.97173.qmail@web20903.mail.yahoo.com> References: <20020828183846.97173.qmail@web20903.mail.yahoo.com> Message-ID: > > ¿estás usando PyDNS? > > http://pydns.sf.net > > Pues gracias a tu consejo (no tenia ni idea de existia eso), si, > me lo he bajado y me he leido las > 40!!! lineas de documentacion que tiene (que dice que terminara > pero que...), con dos o tres > ejemplos y unos ficheros de test, tb. he probado a hacer algo > usando el modulo socket, pero me > sigo teniendo un problema, pq conel PyDNS necesito pasarle el > dominio y yo quisiera saber si se > puede hacer eso sin aber el dominio en el que estas. mm... no creo que sea dificil obtener el dominio local. > La idea es que si es un programa de configuracion, que el mismo > sea capaz de encontrar el dominio > en el que esta. Sabre la IP, porque al menos eso se puede sacar > con el modulo socket, pero como > encuentro la red en la que estoy. tal vez te sirva esto: >>> import socket >>> socket.gethostbyaddr(socket.gethostname()) ('condor.orgmf.com.ar', [], ['10.0.0.3']) >>> -Hernan From mostroratas en yahoo.es Thu Aug 29 12:11:49 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 29 Aug 2002 12:11:49 +0200 (CEST) Subject: continuo con las listas de cadenas de caracteres In-Reply-To: References: Message-ID: <20020829101149.45416.qmail@web20910.mail.yahoo.com> --- "< Sonia >" escribió: hola Sonia, A mi se me ha ocurrido hacerlo asi: lista = [] def contar(list): # inicializo las variables frecuencia = {} lis_resul = [] letra_max=' ' for palabra in lista: for letra in palabra: frecuencia[letra] = frecuencia.get(letra,0)+1 #esto nos cuenta todas las letras for letra in frecuencia: if letra_max == ' ': letra_max = letra #inicializo una, la primera del dict, esto es lo que podrias mejorar elif (frecuencia[letra] > frecuencia[letra_max]): letra_max = letra for pal in lista: if letra_max in pal: lis_resul.append(pal) # la lista resultado con las palabras que tienen a letra_max return (letra_max,lis_resul) #devuelvo las dos para luego poder imprimir ambas tam = int(raw_input('Cuantas palabras quieres introducir?: ')) for palabra in range(0,tam): lista.append(raw_input('Introduce una palabra: ')) print 'Las palabras a mirar son: ',lista res = contar(lista) print 'La letra mas frecuente es: ',res[0] print 'Las palabras que contienen esa letra son: ', res[1] No se si no te gusta que se parezca o no a tu codigo (lo he cambiado un poco), esto hace lo que pides, solo tiene un problema, que lo dejo q te lo curres, es que si tienes una letra repetida en numero de ocurrencias, por ejemplo: Cuantas palabras quieres introducir?: 3 Introduce una palabra: solo Introduce una palabra: hala Introduce una palabra: minu Las palabras a mirar son: ['solo', 'hala', 'minu'] La letra mas frecuente es: a Las palabras que contienen esa letra son: ['hala'] >>> como ves solo presenta una, 'hala' por la letra 'a', cuando la 'o' tb. a parece 2 veces, esto es debido a que al insertar por primera vez en letra_max, coge la primera letra del diccionario, como ya dijo Hernan una vez, es aleatorio quien esta antes en un diccionario (es decir no siempre se comportara igual), asi que yo creo que deberias depurar eso para presentar varias letras si son varias las que coinciden en ocurrencias, quizas que letra_max sea tb un diccionario y ahi incluyes las letras, aunque es un engorro cada vez que encuentres una mejor tendrias que borrarlo todo, no, no me gusta, mejor puedes ir metiendo en una lista las letras que tienes esa misma frecuencia, pero tienes el mismo problema. Bueno ya eso es decision tuya ;)
alguna me ha intentado ayudar dandome trozos de codigo, pero incluian unas sentencias q yo no he dado en clase. os envio lo q he hecho(esta mal, faltan un monton de cosas, pero para eso lo envio)para q me ayudeis. bajo de todo he incuido otra vez el enunciado, por si se apunta alguien mas.
Si hay algo que no entiendas, pues pregunta :) Un saludo. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From siosss en hotmail.com Thu Aug 29 13:15:20 2002 From: siosss en hotmail.com ( Sonia ) Date: Thu, 29 Aug 2002 11:15:20 +0000 Subject: [Python-es] continuo con las listas de cadenas de caracteres Message-ID: Se ha borrado un adjunto en formato HTML... URL: From rapto en arrakis.es Thu Aug 29 13:23:52 2002 From: rapto en arrakis.es (rapto) Date: Thu, 29 Aug 2002 11:23:52 GMT Subject: [Python-es] RE: Hay tipo de datos abstracto 'conjunto' Message-ID: <1e771197fd.197fd1e771@page.melange.net> ¿Alguien ha considerado http://starship.python.net/crew/aaron_watters/kjbuckets/kjbuckets.html ? Es lo que usa gadfly. ----- Mensaje Original ----- Remitente: "Hernan Martinez Foffani" Fecha: Jueves, Agosto 29, 2002 11:21 am Asunto: [Python-es] RE: Hay tipo de datos abstracto 'conjunto' > > quizá sea una tontería, per la verdad es que me vendría muy bien > tener> conjunto o en ingléd 'set' para tener cada elemento sólo > una vez. > > ¿tonteria? nooooo... > hubo varias propuestas de agregar conjuntos como tipo de datos a > python. hasta hace unos días todas las implementaciones habían > sido rechazadas. > > > ¿Hay algo así en Python? > > hay un 99% de probabilidad que haya una implementacion oficial de > conjuntos en la 2.3 > está escrita en python. > > pueden ir haciendo uso de ella en: > http://cvs.sf.net/cgi- > bin/viewcvs.cgi/*checkout*/python/python/dist/src/Lib/sets.py? rev=HEAD&content-type=text/plain > > (cambien plain por x-python para que descargue en vez que aparezca > en el navegador) > > > ... > > ¿Qué más habría que hacer? > > union, intereseccion, substraccion, esta_incluido_en, incluye_a, > conjunto_de_los_subconjuntos, pertenencia, etc. > > prueba con el url que te pasé que el modulo es muy completo. > > en la lista de python-dev están pidiendo feedback de ese modulo > ahora. es nuevito nuevito. > > saludos, > -Hernan > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es > From jcea en argo.es Thu Aug 29 14:03:17 2002 From: jcea en argo.es (Jesus Cea Avion) Date: Thu, 29 Aug 2002 14:03:17 +0200 Subject: Consultas a DNS y Tabla de rutage References: Message-ID: <3D6E0D85.4B3FA8D6@argo.es> > tal vez te sirva esto: > > >>> import socket > >>> socket.gethostbyaddr(socket.gethostname()) > ('condor.orgmf.com.ar', [], ['10.0.0.3']) > >>> >>> import socket >>> socket.gethostname() 'corinto' >>> socket.gethostbyaddr(socket.gethostname()) ('localhost', [], ['127.0.0.1']) :-))) -- Jesus Cea Avion _/_/ _/_/_/ _/_/_/ jcea en argo.es http://www.argo.es/~jcea/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ _/_/_/_/_/ PGP Key Available at KeyServ _/_/ _/_/ _/_/ _/_/ _/_/ "Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/ "My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/ "El amor es poner tu felicidad en la felicidad de otro" - Leibniz From hernan en orgmf.com.ar Thu Aug 29 14:34:09 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 14:34:09 +0200 Subject: [Python-es] continuo con las listas de cadenas de caracteres In-Reply-To: Message-ID: > lo unico q no entiendo es esta sentencia: > frecuencia[letra] = frecuencia.get(letra,0)+1 > > el 'get' no lo he usado nunca. hay otro sinonimo? el 'get' lo que hace es recuperar del diccionario el valor dada la clave (primer parametro), y si no la encuentra devuelve el valor por defecto (segundo parametro) (haz help(dict.get) en la ventana interactiva de python.) es muy practico porque para lograr lo mismo tendrías que hacer algo asi: try: cant = frecuencia[letra] #<-- recupero el valor except KeyError: cant = 0 #<-- cero, si la clave no esta. frecuencia[letra] = cant + 1 > y al final, con el res[0] y res[1]. > ¿no puedes utilizar variables ya definidas > o gastadas en el programa? no te preocupes, en Python las variables no se gastan ;-) saludos, -Hernan From mostroratas en yahoo.es Thu Aug 29 15:19:39 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 29 Aug 2002 15:19:39 +0200 (CEST) Subject: continuo con las listas de cadenas de caracteres In-Reply-To: References: Message-ID: <20020829131939.85139.qmail@web20906.mail.yahoo.com> --- Hernan Martinez Foffani escribió: > > y al final, con el res[0] y res[1]. > > ¿no puedes utilizar variables ya definidas > > o gastadas en el programa? > > no te preocupes, en Python las variables no se gastan ;-) Creo entender que se refiere que por que uso res[0] y res [1] en vez de lis_res y letra_max ?no? es porque son variables locales a la funcion y no podemos acceder a ellas desde fuera de la funcion, desde fuera no sabemos que existen, asi si queremos utilizarlas, las tenemos que devolver o usar variables globales, con lo que tanto el programa como la funcion podian trabajar con ellas. era eso lo que preguntabas? Un saludo. Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From hernan en orgmf.com.ar Thu Aug 29 15:38:05 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 15:38:05 +0200 Subject: [Python-es] RE: Consultas a DNS y Tabla de rutage In-Reply-To: <3D6E0D85.4B3FA8D6@argo.es> Message-ID: > > tal vez te sirva esto: > > > > >>> import socket > > >>> socket.gethostbyaddr(socket.gethostname()) > > ('condor.orgmf.com.ar', [], ['10.0.0.3']) > > >>> > > >>> import socket > >>> socket.gethostname() > 'corinto' > >>> socket.gethostbyaddr(socket.gethostname()) > ('localhost', [], ['127.0.0.1']) > > :-))) touche. :-) faltaba considerar los aliases. no se si en python hay algo mejor que getfqdn(). >>> import socket >>> socket.getfqdn() 'condor.orgmf.com.ar' >>> (si entendi bien la consulta original, se pedia no usar comandos del sistema operativo) -H. From hernan en orgmf.com.ar Thu Aug 29 15:39:49 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Thu, 29 Aug 2002 15:39:49 +0200 Subject: [Python-es] RE: continuo con las listas de cadenas de caracteres In-Reply-To: <20020829101149.45416.qmail@web20910.mail.yahoo.com> Message-ID: para molestar un poco ... > def contar(list): ^^^^---- lista > for palabra in lista: > for letra in palabra: > frecuencia[letra] = frecuencia.get(letra,0)+1 for letra in "".join(lista): frecuencia[letra] = frecuencia.get(letra,0)+1 > for letra in frecuencia: > if letra_max == ' ': > letra_max = letra #inicializo una, la primera del > #dict, esto es lo que podrias > #mejorar > elif (frecuencia[letra] > frecuencia[letra_max]): > letra_max = letra para sacar la inicialización fuera del ciclo, reusa la ultima letra del ciclo anterior (o cualquiera que esté en lista). letra_max = letra # tomo la ultima del ciclo anterior. for letra in frecuencia: if frecuencia[letra] > frecuencia[letra_max]: letra_max = letra o mejor aún, una de las propuestas por Chema ("achicada" en funcionalidad para seguir con el mismo ejemplo): m=max(frecuencia.values()) letra_max=[k for k,v in frecuencia.items() if v==m][0] # me quedo solo con una --------^^^ > for pal in lista: > if letra_max in pal: > lis_resul.append(pal) # la lista resultado con las > # palabras que tienen a letra_max > return (letra_max,lis_resul) #devuelvo las dos para luego > #poder imprimir ambas aqui tambien las comprensiones de listas vienen bien: return letra_max, [pal for pal in lista if letra_max in pal] aunque sospecho que Sonia no va a querer usarlas. ;-) Saludos, -Hernan From mostroratas en yahoo.es Thu Aug 29 15:54:55 2002 From: mostroratas en yahoo.es (=?iso-8859-1?q?Attila=20Saorin?=) Date: Thu, 29 Aug 2002 15:54:55 +0200 (CEST) Subject: continuo con las listas de cadenas de caracteres In-Reply-To: References: Message-ID: <20020829135455.55464.qmail@web20902.mail.yahoo.com> --- Hernan Martinez Foffani escribió: > para molestar un poco ... ya se ve, ya ;) > aunque sospecho que Sonia no va a querer usarlas. ;-) hombre, si las usa, su codigo va a quedar cortito cortito y va a asombrar a la gente, eso si, como tenga que explicar lo que hace a lo mejor le cuesta hacerlo, puede que le cuesta un pelin entender lo que has puesto, te has pasado de forofo pythoniano ;D Attila _______________________________________________________________ Yahoo! Messenger Nueva versión: Webcam, voz, y mucho más ¡Gratis! Descárgalo ya desde http://messenger.yahoo.es From siosss en hotmail.com Thu Aug 29 15:55:59 2002 From: siosss en hotmail.com ( Sonia ) Date: Thu, 29 Aug 2002 13:55:59 +0000 Subject: [Python-es] continuo con las listas de cadenas de caracteres Message-ID: Se ha borrado un adjunto en formato HTML... URL: From aerd en retemail.es Thu Aug 29 19:20:09 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Thu, 29 Aug 2002 19:20:09 +0200 Subject: [Python-es] Hay alguien que use ObjectDomain R3 Message-ID: <000f01c24f80$579eac60$0100a8c0@sicem.biz> Buenas, pues eso, ¿hay alguien que esté usando ObjectDomain R3? Parece la única herramienta que tiene forward y reverse engineering para Python, aunque no crea que tenga round-trip (reintegrar las modificaciones de los códigos fuentes en el modelo). Dentro lo que cabe el precio parece más razonable comparado con Ration Rose, y en el contexto de una mini empresa. Estaría agradecido si alguien pudiese exponer sus experiencias. Saludos cordiales, Erny From chemacortes en wanadoo.es Fri Aug 30 09:21:10 2002 From: chemacortes en wanadoo.es (Chema Cortes) Date: Fri, 30 Aug 2002 08:21:10 +0100 Subject: continuo con las listas de cadenas de caracteres Message-ID: > o mejor aún, una de las propuestas por Chema ("achicada" en > funcionalidad para seguir con el mismo ejemplo): > > m=max(frecuencia.values()) > letra_max=[k for k,v in frecuencia.items() if v==m][0] > # me quedo solo con una --------^^^ Pues para hacerlo así tenía otras "propuestas" que desistí de poner por ser demasiado "bestias" y que lo hacían todo en una sóla línea usando la "reducción": letra_max=reduce(lambda a,b: (a,b)[frecuencia[a]=frecuencia[b] and a or b, frecuencia.keys()) Como he dicho, son demasiado "bestias". Como consejo para seguir manteniendo la salud mental, recomiendo utilizar cualquiera de las otras propuestas :-) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet From Arkaitz.Bitorika en cs.tcd.ie Fri Aug 30 17:43:42 2002 From: Arkaitz.Bitorika en cs.tcd.ie (Arkaitz Bitorika) Date: 30 Aug 2002 16:43:42 +0100 Subject: Error con array In-Reply-To: <20020827174016.GA4341@aenima> References: <20020827174016.GA4341@aenima> Message-ID: <1030722223.7629.1.camel@foleys> Amaya, Estoy casi seguro que tu problema es debido a que en 2.1 la funcion file() no existe, se introdujo mas tarde. En 2.1 deberias poder usar open(), que es un sinonimo de file(). Espero que te ayude. saludos, Arkaitz On Tue, 2002-08-27 at 18:40, Amaya wrote: > Tengo un script cuya misión es analizar logs de iptables en una máquina > que balancea la carga a otras cuatro que tiene detrás. Se trata de saber > cuándo entra una petición y cuándo sale la respuesta para hacer un poco > de benchmark y saber qué tipo de peticiones tardan más. > > El script anda en http://amayita.com/~amaya/python/ donde encontraréis > un tar.bz2 por si os queréis bajar también un log de ejemplo. No he > querido adjuntarlo a este correo por los tamaños. > > Por simplificar un poco, en prueba.py está la parte del script que me > falla, por si a alguno os suena el mensaje de error: > > Traceback (most recent call last): > File "prueba.py", line 24, in ? > print pattern.group(1)[4:], line_num > AttributeError: 'NoneType' object has no attribute 'group' > > El script ya va casi encaminado, y todo gracias a vuestras sugerencias y > observaciones... > > Este script me funciona bien en una Mandrake, pero en mi Debian me > falla: > > Traceback (most recent call last): > File "./prueba.py", line 6, in ? > my_file = file('amaya', 'r') > NameError: name 'file' is not defined > > Versiones de Python: > > ~-arodrigo en cuelebre>rpm -qa | grep python # -----> Mi Mandrake > python-imaging-1.1.2-4mdk > python-2.2.1-4mdk > python-numeric-20.3-2mdk > libpython2.2-2.2.1-4mdk > rpm-python-4.0.4-13mdk > python-base-2.2.1-4mdk > > > ~-amaya en aenima>dpkg -l | grep python # -----> Mi Debian > ii python 2.1.3-6a An interactive object-oriented scripting lan > ii python-numeric 21.3-1 Numerical (matrix-oriented) Mathematics for > ii python-numeric 21.3-1 Extension modules for Numeric Python > ii python1.5-base 1.5.2-18.4 An interactive object-oriented scripting lan > ii python2.1 2.1.3-6a An interactive object-oriented scripting lan > ii python2.1-nume 21.3-1 Numerical (matrix-oriented) Mathematics for > ii python2.1-nume 21.3-1 Extension modules for Numeric Python > ii python2.2 2.2.1-8 An interactive object-oriented scripting lan > ii python2.2-nume 21.3-1 Numerical (matrix-oriented) Mathematics for > ii python2.2-nume 21.3-1 Extension modules for Numeric Python > ii python2.2-opti 1.3-5 advanced command-line parsing library for Py > > ~-amaya en aenima>ls -l /usr/bin/python > lrwxrwxrwx 1 root root 9 2002-08-27 18:50 /usr/bin/python -> python2.1 > > ~-amaya en aenima>/usr/bin/python2.2 prueba.py > > No falla, es increíble. > > ~-amaya en aenima>/usr/bin/python2.1 prueba.py > Traceback (most recent call last): > File "prueba.py", line 6, in ? > my_file = file('amaya', 'r') > NameError: name 'file' is not defined > > ¿Me conviene usar 2.1 o 2.2? > > Gracias de nuevo :-) > > -- > .''`. Life is WYGIWYD: What You Get Is What You Deserve > : :' : > `. `' Proudly running Debian GNU/Linux Sid (2.4.18 + Ext3) > `- www.amayita.com www.malapecora.com www.chicasduras.com > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From siosss en hotmail.com Fri Aug 30 19:07:41 2002 From: siosss en hotmail.com (sonia) Date: Fri, 30 Aug 2002 19:07:41 +0200 (Hora de verano romance) Subject: continuo con las listas de cadenas de caracteres References: Message-ID: <3D6FA65D.000004.65753@w98> a ver! tengo 2 versiones del programa de la lista de cadenas de caracteres y ninguno me funciona. no se puede hacer sin utilizar el get?? aki os pongo los 2 errores de ejecucion. a ver si hay solucion! Las palabras a mirar son: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\def.py", line 28, in ? res = contar(lista) File "A:\def.py", line 10, in contar frecuencia[letra] = frecuencia.get(letra,0)+1 #cuenta todas las letras AttributeError: get Las lista inicial es: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\pra4.py", line 35, in ? res = pra4(lista) File "A:\pra4.py", line 9, in ex frecuencia[letra]=frecuencia[letra,0]+1 TypeError: sequence index must be integer -------Mensaje original------- De: python-es en aditel.org Fecha: viernes, 30 de agosto de 2002 09:28:41 A: python-es en aditel.org Asunto: Re:[Python-es] RE: continuo con las listas de cadenas de caracteres > o mejor aún, una de las propuestas por Chema ("achicada" en > funcionalidad para seguir con el mismo ejemplo): > > m=max(frecuencia.values()) > letra_max=[k for k,v in frecuencia.items() if v==m][0] > # me quedo solo con una --------^^^ Pues para hacerlo así tenía otras "propuestas" que desistí de poner por ser demasiado "bestias" y que lo hacían todo en una sóla línea usando la reducción": letra_max=reduce(lambda a,b: (a,b)[frecuencia[a]=frecuencia[b] and a or b, frecuencia.keys()) Como he dicho, son demasiado "bestias". Como consejo para seguir manteniendo la salud mental, recomiendo utilizar cualquiera de las otras propuestas :-) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) _____________________________________________________________________ Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo ¡¡ desde las 3 de la tarde!! Compruébalo en http://www.wanadoo.es/acceso-internet _______________________________________________ Python-es mailing list Python-es en aditel.org http://listas.aditel.org/listinfo.py/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: no disponible Type: image/gif Size: 494 bytes Desc: no disponible URL: From hernan en orgmf.com.ar Fri Aug 30 21:46:53 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Fri, 30 Aug 2002 21:46:53 +0200 Subject: [Python-es] RE: continuo con las listas de cadenas de caracteres In-Reply-To: <3D6FA65D.000004.65753@w98> Message-ID: > a ver! tengo 2 versiones del programa de la lista de cadenas de > caracteres y ninguno me funciona. no se puede hacer sin utilizar > el get?? en un mail anterior te habia escrito el codigo equivalente a usar get. > aki os pongo los 2 errores de ejecucion. a ver si hay solucion! Las palabras a mirar son: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\def.py", line 28, in ? res = contar(lista) File "A:\def.py", line 10, in contar frecuencia[letra] = frecuencia.get(letra,0)+1 #cuenta todas las letras AttributeError: get get en diccionarios ya lo tenía la version 1.5.2 no es nada nuevo. el mensaje de error me parece medio sospechoso. ¿que version de python usás? (incluye todo el fuente del programa o al menos las primeras lineas de codigo hasta el get.) Las lista inicial es: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\pra4.py", line 35, in ? res = pra4(lista) File "A:\pra4.py", line 9, in ex frecuencia[letra]=frecuencia[letra,0]+1 TypeError: sequence index must be integer ese error es logico porque frecuencia[letra,0] no significa nada en este caso. -Hernan From chemacortes en wanadoo.es Fri Aug 30 20:36:07 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-1?q?Cort=E9s?=) Date: Fri, 30 Aug 2002 20:36:07 +0200 Subject: continuo con las listas de cadenas de caracteres In-Reply-To: References: Message-ID: <200208302036.07750.chemacortes@wanadoo.es> [[Redirigo a la lista un correo de Sonia que no ha podido enviar]] ------------------------------------------------------------------ From: To: python-es en aditel.org Subject: Re:[Python-es] RE: continuo con las listas de cadenas de caracteres (tengo un problemilla con mi correo) a ver! tengo 2 versiones del programa de la lista de cadenas de caracteres y ninguno me funciona. no se puede hacer sin utilizar el get?? aki os pongo los 2 errores de ejecucion. a ver si hay solucion! Las palabras a mirar son: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\def.py", line 28, in ? res = contar(lista) File "A:\def.py", line 10, in contar frecuencia[letra] = frecuencia.get(letra,0)+1 #cuenta todas las letras AttributeError: get Las lista inicial es: ['pepe', 'dale', 'amigo', 'ernesto'] Traceback (innermost last): File "A:\pra4.py", line 35, in ? res = pra4(lista) File "A:\pra4.py", line 9, in ex frecuencia[letra]=frecuencia[letra,0]+1 TypeError: sequence index must be integer -------Mensaje original------- De: python-es en aditel.org Fecha: viernes, 30 de agosto de 2002 09:28:41 A: python-es en aditel.org Asunto: Re:[Python-es] RE: continuo con las listas de cadenas de caracteres > o mejor aún, una de las propuestas por Chema ("achicada" en > funcionalidad para seguir con el mismo ejemplo): > > m=max(frecuencia.values()) > letra_max=[k for k,v in frecuencia.items() if v==m][0] > # me quedo solo con una --------^^^ Pues para hacerlo así tenía otras "propuestas" que desistí de poner por ser demasiado "bestias" y que lo hacían todo en una sóla línea usando la "reducción": letra_max=reduce(lambda a,b: (a,b)[frecuencia[a]=frecuencia[b] and a or b, frecuencia.keys()) Como he dicho, son demasiado "bestias". Como consejo para seguir manteniendo la salud mental, recomiendo utilizar cualquiera de las otras propuestas :-) Saludos, -- Chema Cortes (chemacortes en wanadoo.es) From chemacortes en wanadoo.es Sat Aug 31 00:01:39 2002 From: chemacortes en wanadoo.es (Chema =?iso-8859-1?q?Cort=E9s?=) Date: Sat, 31 Aug 2002 00:01:39 +0200 Subject: continuo con las listas de cadenas de caracteres In-Reply-To: <200208302036.07750.chemacortes@wanadoo.es> References: <200208302036.07750.chemacortes@wanadoo.es> Message-ID: <200208302212.24477.chemacortes@wanadoo.es> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > (tengo un problemilla con mi correo) Tan sólo un consejo: en el nombre de usuario del correo quita los < y > que tienes en "< Sonia >". Esos símbolos se usan normalmente para delimitar la dirección de correo. > a ver! tengo 2 versiones del programa de la lista de cadenas de > caracteres y ninguno > me funciona. no se puede hacer sin utilizar el get?? Sí que se puede, pero resulta más cómodo. Si 'D' es un diccionario, D.get(k) es equivalente a D[k]. La diferencia es que si la clave k no existe D[k] da error, mientras que D.get(k) devolvería el valor por defecto (asignado por D.setdefault()). Si empleas D.get(k,v), en lugar de devolver el valor por defecto devuelve v. Si no quieres usar get, y no quieres que se produzcan errores, tienes dos opciones: 1) capturar el error (try..except) 2) comprobar que la clave existe con d.has_key() Pero lo mejor es el d.get(), que seguro tiene que funcionar. > aki os pongo los 2 errores de ejecucion. a ver si hay solucion! > > > Las palabras a mirar son: > ['pepe', 'dale', 'amigo', 'ernesto'] > Traceback (innermost last): > File "A:\def.py", line 28, in ? > res = contar(lista) > File "A:\def.py", line 10, in contar > frecuencia[letra] = frecuencia.get(letra,0)+1 #cuenta todas las > letras > AttributeError: get Lo más seguro es que 'frecuencia' no lo hayas definido como diccionario. ¿Cómo está definido? Pásanos el código completo. He revisado el código que enviaste a la lista, y veo que inicializas frecuencia así: frecuencia=[] Si te fijas en el código que te hemos mandado, ponemos: frecuencia={} Son llaves, no corchetes. Con llaves {} estamos creando un diccionario vacío. Con los corchetes estarías creando una lista vacía (si no entiendes algo, no dudes en preguntar). Y por cierto, cambia el nombre al fichero. 'def' es un nombre reservado. > Las lista inicial es: > ['pepe', 'dale', 'amigo', 'ernesto'] > Traceback (innermost last): > File "A:\pra4.py", line 35, in ? > res = pra4(lista) > File "A:\pra4.py", line 9, in ex > frecuencia[letra]=frecuencia[letra,0]+1 > TypeError: sequence index must be integer Aquí frecuencia[letra,0] no es correcto. Supongo que lo que querías hacer era algo como frecuencia.get(letra,0). Aquí veo claramente que has definido frecuencia como lista (pide que el índice sea un entero). Saludos, - -- Chema Cortes (chemacortes en wanadoo.es) | LinuxUser#142755 - SuSE Linux 8.0 ZARALINUX http://www.zaralinux.org | "La ignorancia se apodera de quien PYTANDO http://pytando.sf.net | se contenta con lo que sabe" PGPKEY: mailto:chemacortes en wanadoo.es?subject=__PGPKEY__ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9b+tDHLTQrABk8H0RAl6QAJ0UDXOEQuuYcmD6ZVT0G85DtNaxXQCg5Rk3 lAYlf+8+50y1VTWdXWjMVqc= =GnaN -----END PGP SIGNATURE----- From aerd en retemail.es Sat Aug 31 02:18:48 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sat, 31 Aug 2002 02:18:48 +0200 Subject: continuo con las listas de cadenas de caracteres References: <3D6FA65D.000004.65753@w98> Message-ID: <003701c25083$fffcf160$0100a8c0@sicem.biz> Buenas, > Las palabras a mirar son: > ['pepe', 'dale', 'amigo', 'ernesto'] > Traceback (innermost last): > File "A:\def.py", line 28, in ? > res = contar(lista) > File "A:\def.py", line 10, in contar > frecuencia[letra] = frecuencia.get(letra,0)+1 #cuenta todas las letras > AttributeError: get Perdona, es que no entiendo a que viene el get. Supongamos que frecuencia es un diccionario, se accede a su valor usando solo los corchetes, es decir, con 'frecuencia[letra]' con lo que todo quedaría en: frecuencia[letra] = frecuencia[letra] + 1 A partir de Python 2.0 (creo) se usa la forma: frecuencia[letra] += 1 que significa, incrementar en 1. Dado que da error si la clave no existe, y suponiendo una Python 2.2, se puede hacer 2 cosas: Solución1: mediante comprobación si la letra ya existe o no. if letra in frecuencia: frecuencia[letra] += 1 else: frecuencia[letra] = 1 Solución 2: mediante tratamiento de errores: try: frecuencia[letra]+=1 except KeyError: frecuencia[letra]=1 con lo que la función podría quedarse así: def contar(palabras): frecuencia={} for palabra in palabras: for letra in palabra: try: frecuencia[letra]+=1 except KeyError: frecuencia[letra]=1 return frecuencia Para que no te desesperes, te anexo una solución. Algunas funciones, como la búsqueda de máximos, no son óptimas, pero son más fáciles de enteder. Por otra parte, se permite la opción de ignorar la diferencia entre mayúsculas y minúsculas. Finalmente, por favor, siempre poner palabras significativas, porque así se aumenta al legibilidad del código que no te puedes ni imaginar. Buenas noches, Erny --- Outgoing mail is certified Virus Free. Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.384 / Virus Database: 216 - Release Date: 21/08/02 ------------ próxima parte ------------ An embedded and charset-unspecified text was scrubbed... Name: practica.py URL: From aerd en retemail.es Sat Aug 31 05:50:12 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sat, 31 Aug 2002 05:50:12 +0200 Subject: Properties y metodos 'virtuales' Message-ID: <000901c250a1$877d7ca0$0100a8c0@sicem.biz> Hola, suponed el siguiente ejemplo para Python 2.2: class X(object): def set_a(self,value): self._a=value def get_a(self): print "leyendo desde X" return self._a a=property(get_x,set_x) class Y(X): # redefinimos solo el get, extendiéndolo def get_a(self): print "leyendo desde Y" return X.get_a(self) y=Y() y.a=20 print "y.a es", y.a -> Y.get_a no es llamado. porque al establecer property, se ha asignado directamente una función. Lo que básicamente significa que las llamadas no son 'virtuales', pero eso va algo en contra de la filosofía de Python. Yo quiero usarlo en la capa de persistencia, con las propiedades creadas automáticamente, para que el usuario pueda derivar de las clases generadas y meter su propio código en los métodos get y set. Así que reformo la sentencia de clase X para usar expresiones lambda de la siguiente manera: a=property(lambda self: self.get_x(), lambda self,value: self.set_x(value)) ¿Es esa la manera correcta? He leído sobre los métodos __get__, pero no sé si eso puede servir para algo. (Se supone que se puede heredar de property para hacer cualquier tipo de cosas.) Saludos, Erny Por cierto, gracias por el vínculo Thinking in Python. Lo estoy estudiando, tiene temas interesantes. ¿Lo del ObjectDomain R3, no lo ha usado nadie? From hernan en orgmf.com.ar Sat Aug 31 11:34:35 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Sat, 31 Aug 2002 11:34:35 +0200 Subject: Properties y metodos 'virtuales' In-Reply-To: <000901c250a1$877d7ca0$0100a8c0@sicem.biz> References: <000901c250a1$877d7ca0$0100a8c0@sicem.biz> Message-ID: > suponed el siguiente ejemplo para Python 2.2: > > class X(object): > def set_a(self,value): > self._a=value > def get_a(self): > print "leyendo desde X" > return self._a > a=property(get_x,set_x) > > class Y(X): > # redefinimos solo el get, extendiéndolo > def get_a(self): > print "leyendo desde Y" > return X.get_a(self) > > y=Y() > y.a=20 > print "y.a es", y.a > > -> Y.get_a no es llamado. porque al establecer property, se ha asignado > directamente una función. Lo que básicamente significa que las llamadas no > son 'virtuales', pero eso va algo en contra de la filosofía de Python. Yo > quiero usarlo en la capa de persistencia, con las propiedades creadas > automáticamente, para que el usuario pueda derivar de las clases > generadas y meter su propio código en los métodos get y set. > no veo que vaya contra la filosofia de Python. por el momento (no hay una nueva sintaxis) las propiedades se definen en forma explicita mediante el builtin, en el momento de la definicion de la clase. no es mas sencillo que el usuario agregue la llamada a property? class Y(X): # redefinimos solo el get, extendiéndolo def get_a(self): print "leyendo desde Y" return X.get_a(self) a = property(get_a, Y.set_a) en todo caso el usuario ya tiene que llamar a X.get_a(self) en forma explicita! > Así que reformo la sentencia de clase X para usar expresiones lambda de la > siguiente manera: > a=property(lambda self: self.get_x(), lambda self,value: > self.set_x(value)) > > ¿Es esa la manera correcta? He leído sobre los métodos __get__, pero no sé > si eso puede servir para algo. (Se supone que se puede heredar de property > para hacer cualquier tipo de cosas.) property es una clase. pero no creo que por alli vayas muy lejos. en resumen, vos estás queriendo que la llamada a property() de la subclase se haga directamente, sin intervencion del usuario. para ello puedes usar metaclases. > ¿Lo del ObjectDomain R3, no lo ha usado nadie? yo no. pero me alegra saber que alguien le esta haciendo buena competencia a Rational. no se por qué, pero me da la sensación que Rational es a las herramientas CASE, lo que Microsoft a los sistemas operativos. saludos, -Hernan From aerd en retemail.es Sat Aug 31 17:57:53 2002 From: aerd en retemail.es (Ernesto Revilla) Date: Sat, 31 Aug 2002 17:57:53 +0200 Subject: Properties y metodos 'virtuales' References: Message-ID: <001601c2510c$7e4e18e0$0100a8c0@sicem.biz> Hola, ----- Original Message ----- From: "Hernan Martinez Foffani" To: Sent: Saturday, August 31, 2002 11:34 AM Subject: [Python-es] RE: Properties y metodos 'virtuales' > > suponed el siguiente ejemplo para Python 2.2: > > > > class X(object): > > def set_a(self,value): > > self._a=value > > def get_a(self): > > print "leyendo desde X" > > return self._a > > a=property(get_x,set_x) > > > > class Y(X): > > # redefinimos solo el get, extendiéndolo > > def get_a(self): > > print "leyendo desde Y" > > return X.get_a(self) > > > > y=Y() > > y.a=20 > > print "y.a es", y.a > > > > -> Y.get_a no es llamado. porque al establecer property, se ha asignado > > directamente una función. Lo que básicamente significa que las llamadas no > > son 'virtuales', pero eso va algo en contra de la filosofía de Python. Yo > > quiero usarlo en la capa de persistencia, con las propiedades creadas > > automáticamente, para que el usuario pueda derivar de las clases > > generadas y meter su propio código en los métodos get y set. > > > > no veo que vaya contra la filosofia de Python. por el momento > (no hay una nueva sintaxis) las propiedades se definen en forma > explicita mediante el builtin, en el momento de la definicion de > la clase. Por defecto, todos los métodos definidos en la clase son 'virtuales', pienso que también debería existir una manera para hacer que los métodos llamados a partir de un 'property' lo sean. Python es uno (de los pocos) lenguajes, donde todo es virtual por defecto. Eso no es así ni en Java, ni en C++, aunque creo que si es así en Smalltalk y Eiffel. > no es mas sencillo que el usuario agregue la llamada a property? Me gustaría ocultar ese detalle al programador porque cada vez que redefina un get o un set tendría que poner de nuevo el property, y ya sé que algunas veces se lo va a olvidar, y mi tarea es crear la máxima comodidad, claridad y facilidad al programador. (Ese debería ser la meta de cualquiera que escriba un componente (librería, paquete, módulo).) > class Y(X): > # redefinimos solo el get, extendiéndolo > def get_a(self): > print "leyendo desde Y" > return X.get_a(self) > > a = property(get_a, Y.set_a) > > en todo caso el usuario ya tiene que llamar a X.get_a(self) en forma > explicita! Algunas veces, uno lo tiene que ver así de claro, y para ello necesita otra persona, como tú (o vos, en argentino), para iluminarle (como a mi) la mente. Gracias. > > Así que reformo la sentencia de clase X para usar expresiones lambda de la > > siguiente manera: > > a=property(lambda self: self.get_x(), lambda self,value: > > self.set_x(value)) > > > > ¿Es esa la manera correcta? He leído sobre los métodos __get__, pero no sé > > si eso puede servir para algo. (Se supone que se puede heredar de property > > para hacer cualquier tipo de cosas.) > > property es una clase. pero no creo que por alli vayas muy lejos. Todavía no le veo el camino, así que no puedo ver si llega lejos o no. Lo único que se me ocurre es alguna cosa como esta: class virtualproperty(property): def __init__(self, getmethod=None, setmethod=None, delmethod=None, doc=''): if getmethod: getmethod=eval("lamda self: self.%s()" % getmethod.func_name) if setmethod: setmethod=eval("lamda self: self.%s()" % setmethod.func_name) if delmethod: delmethod=eval("lamda self: self.%s()" % delmethod.func_name) property.__init__(self, getmethod, setmethod, delmethod, doc) Pero quizá tengas trazón que sea mejor con tratar la creación de los properties desde las metaclases. > en resumen, vos estás queriendo que la llamada a property() de la > subclase se haga directamente, sin intervencion del usuario. > para ello puedes usar metaclases. Bueno, habrá que pensarlo y hacerlo con metaclases. La semántica no está clara con herencia múltiple donde se repiten alguna de las propiedades para el caso de get, porque sólo puede devolver uno de los valores, creo que el primero que encuentre es el que sirve. > > ¿Lo del ObjectDomain R3, no lo ha usado nadie? > > yo no. pero me alegra saber que alguien le esta haciendo buena competencia > a Rational. no se por qué, pero me da la sensación que Rational es a las > herramientas CASE, lo que Microsoft a los sistemas operativos. Sí, además por lo visto el Visual Studio Enterprise contiene una copia casi exacta del Rational Rose (los objetos COM también se llaman Rose.*). Pero me quería despegar un poco de M$, por ello estoy con Python, y espero que mediante cosas de ActiveState no pierda la compatibilidad hacia la plataforma .NET (que ahora mismo no toco). El tema del ObjectDomain (OD), es que incluye un interprete JPython 2.0 para poder acceder al meta-modelo, y ya incluye pantillas de generación de código y también de ingeniería inversa (que sinceramente podría mejorar bastante). A largo plazo me gustaría poder integrar un editor Python, como IDLE (yo trabajo con PythonWin) con un entorno de modelado y saltar entre ambos según necesidad (desde la definición de clase a algún diagrama, y viceversa). En algún sitio (www.objectsbydesign.com) leí que incluso sería posible crear diagramas de secuencia mediante trazas creadas por depurador. En algunos casos esto podría dar más luz sobre qué está pensando en programas que tengan cierta complejidad. Saludos cordiales, Erny > > saludos, > -Hernan > > _______________________________________________ > Python-es mailing list > Python-es en aditel.org > http://listas.aditel.org/listinfo.py/python-es From hernan en orgmf.com.ar Sat Aug 31 20:39:32 2002 From: hernan en orgmf.com.ar (Hernan Martinez Foffani) Date: Sat, 31 Aug 2002 20:39:32 +0200 Subject: Properties y metodos 'virtuales' In-Reply-To: <001601c2510c$7e4e18e0$0100a8c0@sicem.biz> References: <001601c2510c$7e4e18e0$0100a8c0@sicem.biz> Message-ID: > > en resumen, vos estás queriendo que la llamada a property() de la > > subclase se haga directamente, sin intervencion del usuario. > > para ello puedes usar metaclases. > Bueno, habrá que pensarlo y hacerlo con metaclases. una posibilidad... class X(object): class __metaclass__(type): def __init__(cls, name, bases, dict): cls.a = property(cls.get_a, cls.set_a) def set_a(self, value): self._a = value def get_a(self): print "X" return self._a class Y(X): def get_a(self): print "Y" return super(Y, self).get_a() x=X() x.a=3 print "x.a:", x.a y=Y() y.a=20 print "y.a", y.a Y aún así, el usuario no se puede olvidar de poner el return super(Y, self).get_a(self) > La semántica no está clara con herencia múltiple donde se > repiten alguna de las propiedades para el caso de get, porque > sólo puede devolver uno de los valores, creo que el > primero que encuentre es el que sirve. super(C, self).metodo(args) se encarga de hacer la resolucion de la herencia multiple. -Hernan