Un gestor de eventos en Python
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:
[python]
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])
[/python]
Aquí está el código del módulo:
[python]
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)
[/python]




Comments
Sencillo y elegante
Desde luego cumple el zen de python.
Supongo que fue lo que empleaste para auto-twittear los post de Sweetter.
Tiene buena pinta, ¡enhorabuena!
Buen aporte.
Dejo este comentario simplemente para agradecer la subida de estos módulos, ya que los ando utilizando actualmente.
Un saludo.