llamar una funcion con parametro (completa)

Esteban Manchado Velázquez zoso en demiurgo.org
Vie Ene 31 10:37:24 CET 2003


On Fri, Jan 31, 2003 at 09:32:58AM +0100, Joaquin Jose del Cerro Murciano wrote:
> 
> Si haces el "... command = self.nuevo_renglon(nro)...", lo que estas haciendo 
> es asignarle al command el resultado de invocar a la funcion con el parametro 
> "nro", que no es lo que se pretende. El command lo que ha de recibir es un 
> "apuntador" a la funcion, no el resultado de su ejecucion, y eso se consigue 
> referenciando a la funcion sin ponerle los parentesis, "... command = 
> self.nuevo_renglon ...". Pero !ho! albricias, asi no le puedes pasar 
> parametros.
> 
> Esto puedes solucionarlo de varias maneras:
> 1) la funcion "self.nuevo_renglon" es un metodo de una clase (por lo del 
> self). Podrias dejar el parametro en el objeto y recojerlo cuando se invoque 
> el metodo "nuevo_renglon":
> 
> def botonera(self,nro):
>  ...
>  self.nro = nro
>  botones.add('Nuevo',command = self.nuevo_renglon)
>  ...
> 
> def nuevo_renglon(self):
>   nro = self.nro
>   agrego_cosas.....
> 
> 2) La opcion uno es valida cuando tienes una clase de por medio. Pero ¿ y si  
> no tienes una clase de por medio ? Pues te montas una a modo wraper.
> 
> class MiFuncion(object):
>   def __init__(self, callback, nro):
>     self.callback = callback
>     self.nro = nro
> 
>   def __call__(self):
>     self.callback(nro)
> 
> def botonera(self,nro):
>  ...
>  botones.add('Nuevo',command = MiFuncion(self.nuevo_renglon,nro) )
>  ...
> 
> def nuevo_renglon(self, nro):
>   agrego_cosas.....

   ¿No se puede hacer más fácilmente con una lambda?

   Una vez tuve un problema similar, y lo resolví (gracias a esta lista) con
una lambda con valor por omisión. Me explico:

   Si necesitas pasar una función que reciba un parámetro fijo, ¿por qué no
crear una segunda función que llame a la primera con ese parámetro? Creas una
función lambda así:

   lambda f x=nro : self.nuevo_renglon(x)

(tengo la sintaxis de las lambda oxidada; no recuerdo cómo era exactamente) Y
ya puedes llamar a una función (la «f») que llama a self.nuevo_renglon con el
parámetro nro.

-- 
Esteban Manchado Velázquez <zoso*at*demiurgo*dot*org> - www.demiurgo.org
No software patents! - http://freepatents.org - proinnova.hispalinux.es
Join Amnesty International - http://www.amnesty.org/actnow




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