[pyar] set y lista con señales estilo gtk

Lucio Torre lucio.torre en gmail.com
Mar Jun 8 00:29:54 ART 2010


2010/5/5 david weil <tenuki en gmail.com>:
>
> Podes evitar todo el enredo de que métodos tenes que registrar o no, y
> registrarlos a mano, si cuando llaman a un método del wrapper te haces
> una copia del set, le ejecutas el método llamado a la copia y luego lo
> comparas con el set original. Si cambió, cambió, sinó, no.. y te
> quedás con el correspondiente..

Lo bueno del set es que con solo comparar el tamanio alcanza para
saber si cambio. Hice esto:

def change_monitor(cls, name):
   method = getattr(cls, name)
   def inner(self, *args, **kwargs):
       previous_len = len(self)
       method(self, *args, **kwargs)
       if len(self) != previous_len:
           self.emit('gset-changed')
   return inner

class GSet(set):
   """A set that emits gtk-like signals when changed."""

   def __init__(self, content=None):
       if content is None:
           super(GSet, self).__init__()
       else:
           super(GSet, self).__init__(content)

       self.callbacks = {}

   def connect(self, name, callback):
       self.callbacks.setdefault(name, []).append(callback)

   def emit(self, name, *args, **kwargs):
       for cb in self.callbacks.get(name, []):
           cb(self, *args, **kwargs)

   add = change_monitor(set, "add")
   clear = change_monitor(set, "clear")
   difference_update = change_monitor(set, "difference_update")
   discard = change_monitor(set, "discard")
   pop = change_monitor(set, "pop")
   symmetric_difference_update = change_monitor(
       set, "symmetric_difference_update")
   update = change_monitor(set, "update")
   remove = change_monitor(set, "remove")



More information about the pyar mailing list