Presentacion (Era Definir Listas Globales)

Esteban Manchado Velázquez zoso en demiurgo.org
Mie Mar 10 19:08:12 CET 2004


On Wed, Mar 10, 2004 at 02:33:15PM +0100, Antonio Castro wrote:
> [...]
> Tuve problemas para usarlo así. No recuerdo exactamente el motivo pero
> era cosa de las librerías que uso. self.funcionX(algo) debe ser recibido
> como def funcionX(self, algo) y cuando la funcionX es tuya no hay
> problema en adaptarla,  pero cuando es la funcion de una librería
> que espera cierto número de argumentos, y  si ese algo que quieres pasar
> debe ser manejado en alguna otra función, es cuando se me crea el problema.

   No he leído mucho el resto de la conversación, pero este detalle me llamó
la atención, porque la primera vez que usé Python tuve este mismísimo problema
:-( (¿estarás haciendo algo con Jabber?)

   Mi forma de resolverlo (lo de «mi» es un decir, porque pregunté en esta
lista y me recomendaron la solución aquí, si no recuerdo mal) fue crear una
pequeña función lambda, para adaptarla a la forma de la llamada que se
esperaba. Además, tuve que usar un truco sucio por la falta de «cierres» de
Python. Al final quedó algo así, me parece:

   self.metodo_lambda = lambda algo, s=self : s.metodo(algo)
   registraFuncion(self.metodo_lambda)

(Escribo de memoria, no sé ahora si la sintaxis de lambda es así) La gracia
del asunto es que con una pequeña función lambda puedes hacer un rápido
adaptador de un método, para que se llame de otra manera. Sobre lo de usar la
«s», es necesario porque tienes que llamar al self de cuando _defines_ la
función lambda, no cuando la _llamas_. De ahí que no puedas usar «self»
directamente (porque Python cogería el self del contexto donde finalmente se
llamara a metodo_lambda), sino que tengas que pasar un parámetro «fantasma»
con un valor por omisión. Como el valor por omisión se calcula al _definir_ la
función lambda, obtienes lo que quieres.

   Espero haberme explicado. Saludos,

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




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