[Python-es] ¿Cierres en Python?

Esteban Manchado Velázquez zoso en demiurgo.org
Mie Ago 7 13:11:10 CEST 2002


Hola a todos.

   Estoy haciendo experimentos con Jabber (al final preferí Jabber a XML-RPC
por algunas razones), pero tengo un problemilla que sospecho que más bien se
debe a mi ignorancia sobre Python (uso la versión 2.1), más que sobre Jabber y
cía.

   He buscado un poquito por la red pero no he encontrado la respuesta a mis
plegarias, así que pregunto por aquí, a ver si a alguien se le ocurre una
solución. La situación es la siguiente:

   Tengo una clase que internamente crea un objeto de conexión Jabber. Los
detalles no importan, excepto que hay un método para establecer llamadas a
funciones definidas por el usuario, bajo ciertas circunstancias (cuando se
recibe un mensaje nuevo, por ejemplo). La función que me interesa tiene que
recibir dos parámetros, pero yo quiero que esa función sea un método del
objeto actual. Esto es un problema, si entiendo bien Python, por el parámetro
implícito «self» (necesitaría declarar tres parámetros, y la llamada falla).

   La solución que se me había ocurrido era crear una función lambda o algo
similar, que contuviera implícitamente una referencia al objeto actual (esta
función lambda se crearía en el constructor del objeto)... pero parece, según
dicen en la Red, que Python no tiene «closures» o cierres. Es decir, que lo
que se me había ocurrido era algo como:

------------------------- 8< -------------------------
class Clase:
   def __init__(self):
      # ...           
      self.f = lambda con, msg: self.nuevoMensaje(con, msg)
      self.jabber.setMessageHandler(self.f)                

   def nuevoMensaje(self, con, msg):
      print "He recibido un nuevo mensaje con el texto %s" % msg
------------------------- >8 -------------------------

Pero no funciona, porque en la función lambda (o sea, f) no se recuerda el
valor que tenía «self» EN LA CREACIÓN DE LA FUNCIÓN, sino que se intenta
referenciar a un tal «self» que exista (o no, que es el caso) en el contexto
en que se la llame.

   Todo esto es bastante abstracto, así que no sé si se entiende. Si quieren
más aclaraciones, ya saben (tengo muchas ganas de resolver esto). Igual es un
problema de concepción general y habría que hacerlo de una manera
completamente diferente.

   Saludos,

-- 
Esteban Manchado Velázquez <zoso*demiurgo*org> - http://www.demiurgo.org
No software patents in Europe! - 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