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:

  1. from events import EventManager, Event
  2.  
  3. def func1(*args):
  4. print "Im the func1 with args: " + str(args)
  5.  
  6. def func2(*args):
  7. print "Im the func2 with args: " + str(args)
  8.  
  9. def func3(*args):
  10. print "Im the func3 with args: " + str(args)
  11.  
  12. # Creating the eventManager
  13. em = EventManager()
  14.  
  15. # Create some events
  16. event1 = Event('event1')
  17. event2 = Event('event2')
  18.  
  19. em.add_event(event1)
  20. em.add_event(event2)
  21.  
  22. # Connecting functions with events
  23. em.connect('event1', func3, [1,2])
  24. em.connect('event1', func2)
  25. em.connect('event2', func1)
  26.  
  27. # Sending signals
  28. print "sending event1..."
  29. em.signal('event1')
  30. print "sending event2..."
  31. em.signal('event2')
  32.  
  33. # sending signal with arguments
  34. print "sending event1 with arguments..."
  35. em.signal('event1', [1,2,3])

Aquí está el código del módulo:

  1. class Event:
  2. def __init__(self, name):
  3. self.name = name
  4. self.listeners = {}
  5.  
  6. def add(self, function, data=None):
  7. self.listeners[function] = data
  8.  
  9. def delete(self, function):
  10. self.listeners.pop(function)
  11.  
  12. def called(self, data=None):
  13. for function, d in self.listeners.items():
  14. if data is None:
  15. if d is None:
  16. function()
  17. else:
  18. if type(d) == type([]):
  19. function(*d)
  20. elif type(d) == type({}):
  21. function(**d)
  22. else:
  23. function(d)
  24. else:
  25. if type(data) == type([]):
  26. function(*data)
  27. elif type(data) == type({}):
  28. function(**data)
  29. else:
  30. function(data)
  31.  
  32.  
  33. class EventManager:
  34. def __init__(self):
  35. self.events = {}
  36.  
  37. def add_event(self, Event):
  38. self.events[Event.name] = Event
  39.  
  40. def del_event(self, Event):
  41. self.events.pop(Event.name)
  42.  
  43. def connect(self, event, function, data=None):
  44. self.events[event].add(function, data)
  45.  
  46. def disconnect(self, event, function):
  47. self.events[event].delete(function)
  48.  
  49. def signal(self, event, data=None):
  50. if data is None:
  51. self.events[event].called()
  52. else:
  53. self.events[event].called(data)

J. Félix Ontañón's picture
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!

Submitted by J. Félix Ontañón (not verified) on Sat, 08/11/2008 - 14:35.