[Python-es] problema con getattr y otras dudas de novato...

Kike Cabrera kikecalpe en gmail.com
Mar Ene 8 19:02:54 CET 2008


>
> Date: Sun, 6 Jan 2008 18:24:46 +0100
> > From: "Kike Cabrera" <kikecalpe en gmail.com>
> > Subject: [Python-es] problema con getattr y otras dudas de novato...
> > To: python-es en aditel.org
> > Message-ID:
> >         <14ecb63c0801060924l1ab984cey66b978d403ec87ea en mail.gmail.com>
> > Content-Type: text/plain; charset=UTF-8
> >
> > Estoy intentando hacer una funcion como el ejemplo 4.12 de 'inmersion en
> > python'<
> > http://almacen.gulic.org/diveintopython-5.4-es/power_of_introspection/getattr.html
> > >,
> > que utiliza getattr para distinguir a que funcion debe llamar.
> > El problema es que las funciones que deben ser llamadas estan dentro de
> > otra
> > y no se como puedo hacer para llamar a estas puesto que en el ejemplo
> > citado
> > se requiere que esten en un modulo, tal vez hay algo que no entendí
> > bien.
> > ejemplo;
> >
> > def funcion_principal(entero, lista):
> >   def subfuncion_uno(lista):
> >   def subfuncion_dos(lista):
> >   diccionario = {1:'uno', 2:'dos'}
> >   num = diccionario[entero] # asigno a num el valor de entero en el
> > diccionario
> >   subfuncion_salida = getattr(¿modulo?, "subfuncion_%s" % num) # ¿como
> > puedo
> > decir q la funcion está aquí mismo??
> >   subfuncion_salida(lista) #¿esto funcionaria?
> >
> > como veis tengo varias dudas.
> > muchas gracias a todos por vuestra ayuda y ¡¡¡feliz año nuevo!!!
> >
> > ------------------------------
> >
> > Date: Sun, 06 Jan 2008 18:52:53 +0100
> > From: Arnau Sanchez <pyarnau en gmail.com>
> > Subject: Re: [Python-es] problema con getattr y otras dudas de
> >         novato...
> > To: Lista de discusión sobre python en castellano
> >         <python-es en aditel.org>
> > Message-ID: <47811575.5050007 en gmail.com>
> > Content-Type: text/plain; charset=UTF-8; format=flowed
> >
> > Kike Cabrera escribió:
> >
> > > def funcion_principal(entero, lista):
> > >   def subfuncion_uno(lista):
> > >   def subfuncion_dos(lista):
> > >   diccionario = {1:'uno', 2:'dos'}
> > >   num = diccionario[entero] # asigno a num el valor de entero en el
> > > diccionario
> > >   subfuncion_salida = getattr(¿modulo?, "subfuncion_%s" % num) #
> > ¿como puedo
> > > decir q la funcion está aquí mismo??
> > >   subfuncion_salida(lista) #¿esto funcionaria?
> >
> > Tienes que usar el diccionario de variables locales que te da el
> > built-in "locals()":
> >
> > def f1():
> >     pass
> >
> > fun = locals()["f1"]
>
>
Diste en el clavo, así fue como resolvi el problema despues de leer tu
mensaje.

En tu ejemplo, habitualmente podrías:
> >
> > diccionario = {1: subfuncion_uno, 2: subfuncion_dos}
> >
> > Pero tambiÃ(c)n puede ser útil hacerlo de forma indirecta, depende del
> > contexto.
>
>
Tambien es una opcion valida, sin embargo, ya empece a usar el otro modo ya
que creo que en el futuro me puede servir.

------------------------------
> >
> >
> Date: Mon, 7 Jan 2008 20:08:46 -0300
> From: "Milton Galo Patricio Inostroza Aguilera" < minoztro en gmail.com>
> Subject: Re: [Python-es] problema con getattr y otras dudas de
>         novato...
> To: " Lista de discusión sobre python en castellano "
>         < python-es en aditel.org>
> Message-ID:
>         <172699c50801071508m574af8afgf65a601ed7c239e9 en mail.gmail.com >
> Content-Type: text/plain; charset=ISO-8859-1
>
> El 6/01/08, Kike Cabrera <kikecalpe en gmail.com> escribió:
> > Estoy intentando hacer una funcion como el ejemplo 4.12 de 'inmersion en
>
> Hola Kike
>
> > python'<http://almacen.gulic.org/diveintopython-5.4-es/power_of_introspection/getattr.html
> >,
> > que utiliza getattr para distinguir a que funcion debe llamar.
> > El problema es que las funciones que deben ser llamadas estan dentro de
> otra
> > y no se como puedo hacer para llamar a estas puesto que en el ejemplo
> citado
> > se requiere que esten en un modulo, tal vez hay algo que no entendí
> bien.
>
> ¿es necesario que la definición de una función esté dentro de otra
> función? ¿Por qué?


Es necesario porque es como mejor me aclaro yo, es el primer programa que
hago y asi me resulta mas sencillo. Lo unico que hago es aplicar el dicho
"divide y venceras". Asi que procuro dividir las tareas que debo hacer
correr en mi programa al maximo para ir paso a paso, repito que es mi primer
programa en python.
En un futuro y para ir ampliando conocimientos espero hacerlo funcionar
mediante clases, etc, no lo hago todavia porque me cuesta entender como
trabajar con estas. No se si se podra hacer, ni si sera mas sencillo o mas
complicado que como lo estoy haciendo, pero por lo menos lo intentare.

> ejemplo;
> >
> > def funcion_principal(entero, lista):
> >   def subfuncion_uno(lista):
> >   def subfuncion_dos(lista):
> >   diccionario = {1:'uno', 2:'dos'}
> >   num = diccionario[entero] # asigno a num el valor de entero en el
> > diccionario
> >   subfuncion_salida = getattr(¿modulo?, "subfuncion_%s" % num) # ¿como
> puedo
> > decir q la funcion está aquí mismo??
> >   subfuncion_salida(lista) #¿esto funcionaria?
>
> Podrías mandarnos código bien indentado para poder hacer pruebas?


El codigo bien indentado se puede copiar desde el foro de
losersjuegos.com.ar<http://www.losersjuegos.com.ar/foro/viewtopic.php?t=220>,
aunque la parte sobre la que estoy trabajando todavia me da algun error y
creo que tenga tiempo a postearla en el foro hasta el fin de semana. ¡Espero
comentarios!

>
> > como veis tengo varias dudas.
>
> Al parecer es generalmente útil el método getattr cuando debes decidir
> a qué función llamar y no lo sabes con antelación, entonces tienes la
> opción de llamarla en tiempo de ejecución sólo con su nombre.


Como puedes ver mas arriba lo he resuelto sin getattr, pero si, es muy util
para llamar a funciones de otros modulos sin conocer previamente el nombre.
En este caso la funcion esta en el mismo modulo asi que es suficiente con
apelar a locals()['nombreFuncion']

> muchas gracias a todos por vuestra ayuda y ¡¡¡feliz año nuevo!!!
>
> Feliz año nuevo :-)


;O)

>
> > _______________________________________________
> > Lista de correo Python-es
> > http://listas.aditel.org/listinfo/python-es
> > FAQ: http://listas.aditel.org/faqpyes
> >
>
>
> --
> Milton Inostroza Aguilera
>
>
> ------------------------------
>
> Date: Tue, 08 Jan 2008 18:08:48 +0100
> From: Arnau Sanchez <pyarnau en gmail.com>
> Subject: Re: [Python-es] problema con getattr y otras dudas de
>         novato...
> To: Lista de discusión sobre python en castellano
>         <python-es en aditel.org>
> Message-ID: <4783AE20.2060107 en gmail.com >
> Content-Type: text/plain; charset=ISO-8859-1; format=flowed
>
> Milton Galo Patricio Inostroza Aguilera escribió:
>
>   > ¿es necesario que la definición de una función esté dentro de otra
> > función? ¿Por qué?
>
> No sé si es necesario en este caso, pero definir funciones dentro de
> otras es perfectamente aceptable (si bien no muy extendido en Python, es
> práctica común en otros lenguajes, LISP y dialectos especialmente).
>
> Una ventaja es que te permite romper código en trozos más pequeños (a
> los que, además, debes poner un nombre), sin tener que crear más y más
> funciones en el primer nivel (que ensuciarían innecesariamente el
> espacio de nombres).
>
> Si quieres crear código que siga paradigmas de FP (programación
> funcional) es casi inevitable hacerlo. Un ejemplo muy simple:
>
> def procesar_elementos(elementos):
>     de procesar(elemento):
>         # hacer cosas
>         # return resultado
>     def condicion(elemento):
>         # hacer cosas
>         # return resultado_de_la_condicion
>     # return map(procesar, filter(condicion, elementos))
>     return [procesar(elemento) if condition(elemento)]
>
> Quería completar la entrada de FP que hay en el FAQ, pero si hay algún
> experto en la sala le cedo el trabajo gustoso. Lo poco que sé de FP lo
> he aprendido resolviendo problemas del proyecto Euler, para los curiosos:
>
> http://pyeuler.wikidot.com/
>
> Aunque Python no es, ni por asomo, el lenguaje ideal para FP, desde que
> cuenta con iteradores y generadores se pueden hacer cosas muy
> interesantes. Para FP de verdad, hay que irse a otros lenguajes como
> Haskell.
>
> arnau
>
> Como ya he dicho programo funcionalmente porque estoy aprendiendo, lo
considero la mejor manera de coger practica en como se hace cada cosa. En un
futuro lo intentare con clases, no se si sera mas sencillo o practico, pero
creo que si puede serlo para segun que cosas. Una buena lectura al respecto
es este articulo<http://blog.rvburke.com/2006/11/22/programacion-orientada-a-objetos-en-python/>
.

Muchas gracias a todos por vuestra respuesta, espero vuestros comentarios
sobre el programa en el foro de
losersjuegos.com<http://www.losersjuegos.com.ar/foro/viewtopic.php?t=220>


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