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