Un gestor de eventos en Python
Submitted by danigm on Sat, 08/11/2008 - 14:03

Hace ya algún tiempo se me planteó el problema de tener una serie de funciones que se tienen que ejecutar cuando ocurre algo (un evento) y me hice un pequeño modulo en python para cubrir ese asunto.
Me basé en lo que conocía de pygtk, señales y eventos, así pues el funcionamiento básico es que tú declaras un evento, asignas funciones a ese evento, y cuando lances una señal, todas las funciones asociadas a ese evento se lanzan.
Se puede instalar de forma simple así:
sudo easy_install events
Aquí un ejemplo de uso:
from events import EventManager, Event def func1(*args): print "Im the func1 with args: " + str(args) def func2(*args): print "Im the func2 with args: " + str(args) def func3(*args): print "Im the func3 with args: " + str(args) # Creating the eventManager em = EventManager() # Create some events event1 = Event('event1') event2 = Event('event2') em.add_event(event1) em.add_event(event2) # Connecting functions with events em.connect('event1', func3, [1,2]) em.connect('event1', func2) em.connect('event2', func1) # Sending signals print "sending event1..." em.signal('event1') print "sending event2..." em.signal('event2') # sending signal with arguments print "sending event1 with arguments..." em.signal('event1', [1,2,3])
Aquí está el código del módulo:
class Event: def __init__(self, name): self.name = name self.listeners = {} def add(self, function, data=None): self.listeners[function] = data def delete(self, function): self.listeners.pop(function) def called(self, data=None): for function, d in self.listeners.items(): if data is None: if d is None: function() else: if type(d) == type([]): function(*d) elif type(d) == type({}): function(**d) else: function(d) else: if type(data) == type([]): function(*data) elif type(data) == type({}): function(**data) else: function(data) class EventManager: def __init__(self): self.events = {} def add_event(self, Event): self.events[Event.name] = Event def del_event(self, Event): self.events.pop(Event.name) def connect(self, event, function, data=None): self.events[event].add(function, data) def disconnect(self, event, function): self.events[event].delete(function) def signal(self, event, data=None): if data is None: self.events[event].called() else: self.events[event].called(data)




Desde luego cumple el zen de python.
Supongo que fue lo que empleaste para auto-twittear los post de Sweetter.
Tiene buena pinta, ¡enhorabuena!
- reply
Submitted by J. Félix Ontañón (not verified) on Sat, 08/11/2008 - 14:35.