[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