Un gestor de eventos en Python

danigm's picture

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

2
J. Félix Ontañón's picture

Desde luego cumple el zen de python.

Supongo que fue lo que empleaste para auto-twittear los post de Sweetter.

Tiene buena pinta, ¡enhorabuena!

Norbi's picture

Dejo este comentario simplemente para agradecer la subida de estos módulos, ya que los ando utilizando actualmente.

Un saludo.