[Python-es] ¿Cierres en Py thon?

Jose Alejandro Perez Rubio perezj en si.uji.es
Jue Ago 8 09:53:22 CEST 2002


Buenos días, 

  He leído el problema que se describía inicialmente, y parece que la
solución pasa por crear una función lambda con un valor por defecto en
uno de sus parámetros. Pero yo he probado esto:

$ python2.2
>>> class foo :
...   def __init__( self, m ):
...     self.msg = m
...   def handler( self, x,y ):
...     print "Soy %s %d %d" % ( self.msg, x, y )
... 
>>> f = foo( "Luis" )
>>> a = f.handler
>>> a( 3,4 )
Soy Luis 3 4

Cuando llamamos se ejecuta 'a( 3,4 )' estamos llamando a la metodo
handler de la instacia contenida por f
Creo entender el problema inicial, pero si esto funciona por que no
hacer ...

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

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

Recordaba algún caso parecido, pero no se donde, en cualquier caso
probé lo siguiente:

class registre:
  def add( self, prg):
    self.prg = prg
  def exe( self ):
    self.prg( 1,2 )
  def loop( self ):
    import os, time
    if os.fork() == 0 :
      for i in range(4):
        self.exe()
        time.sleep(1)

class foo:
  def __init__( self, msg ):
    self.msg = msg
    self.rg  = registre()
    # Esto debía ser algo parecido a Jabber
    self.rg.add( self.handler ) 
    self.rg.loop()
  def handler( self, x, y ):
    print self.msg, x, y

foo( "Aun vivo" )

Y obtuve lo que se podía esperar:
Aun vivo 1 2
Aun vivo 1 2
Aun vivo 1 2
Aun vivo 1 2

¿Quizá no entendido nada? o ¿Jabber hace algo raro con sus
MessageHandlers?

Un saludo






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