Binding de las variables libres de funciones

Oswaldo Hernández listas en soft-com.es
Jue Nov 6 23:06:19 CET 2008


German Kruszewski escribió:
> Hola, este es mi primer mensaje a la lista. Recién comienzo con python y
> tengo una duda.
> Mi problema es el siguiente: quiero construir automáticamente n funciones
> que hagan acciones muy parecidas entre sí. Digamos por ejemplo que cada f_i
> tiene que imprimir el texto "Esta es la función i".
> La manera de hacerlo que se me ocurrió fue la siguiente:
> class C:
>     def __init__(self):
>         for i in range(1,3):
>             def f():
>                 print "Esta es la funcion %i" % i
>             setattr(self, 'f' + str(i), f)
> ...

Hola,

El problema de asignar funciones con setattr es que siempre ejecutas la misma funcion, por lo qe sus 
datos locales siempre son los mismos.

Una de las posibles soluciones (supongo que habrán otras mejores) es crear una clase que contenga la 
función y crear una instancia cada vez, de esta forma, cada instancia mantiene sus propios datos 
locales:

 >>> class FuncionF:
...     yo = None
...     def __init__(self, i):
...         self.yo = i
...
...     def f(self):
...         print "Esta es la funcion %s" % self.yo
...
 >>> class C:
...     def __init__(self):
...         for i in range(1,3):
...             x = FuncionF(i)
...             setattr(self, "f%s" % i, x.f)
...
 >>> c = C()
 >>> c.f1()
Esta es la funcion 1
 >>> c.f2()
Esta es la funcion 2


Saludos,
-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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