====== Pure python and very simple event management library ====== In event driven programming events are crucial. My requirements was [[http://micropython.org/|Micropython]] platform on ESP32 micro-controller, so i could not use any other events library out-there. I've stumbled one very basic, very simple library and gave it a try... and it worked out-of-the-box for my case. When testing various event management libs out there I've stumbled on something similar, but it did not worked within classes. Python is nothing but classes everywhere :) I was testing and extended this very simple python script, that perfectly works as main element in event driven development. Strengths of library: * Observer can be declared before event type is created * Events can be fired even if there is no observers. * Works as pure python script * Works on micropython platform * Event name can be any string I'm using this solution for event for timer, that fires each second and observe "ticker" where i need to update clock. I use clock in multiple places in my micropython script and i can get away with just one hardware timer used. Honorable mentions goes to Pithikos from StackOverflow [[https://stackoverflow.com/a/28479007|this answer]] I have extended this library with possibility to forget event. class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observed_events = [] def observe(self, event_name, callback_fn): self._observed_events.append({'event_name': event_name, 'callback_fn': callback_fn}) def forget(self, event_name): for dict_item in self._observed_events: for key, val in dict_item.items(): if val == event_name: self._observed_events.remove(dict_item) class Event(): def __init__(self, event_name, *callback_args): for observer in Observer._observers: for observable in observer._observed_events: if observable['event_name'] == event_name: observable['callback_fn'](*callback_args) Here is example of how to use this library import EventObserver # class object MUST inherit Observer object if you use it within class class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # DON'T FORGET THIS # observer can be declared already in class init method with following line # this.observe('someone sneezed', this.someone_sneezed) def someone_arrived(self, who): print("{} has arrived!".format(who)) def someone_sneezed(self, who): print("{} has just sneezed!".format(who)) # Observe for specific event room = Room() room.observe('arrived', room.someone_arrived) room.observe('sneezed', room.someone_arrived) # Fire some events Event('left', 'John') # no events are attached to event "someone left" Event('arrived', 'Lenard') # will output "Lenard has arrived!" Event('sneezed', 'Jenny') # will output "Jenny has just sneezed!" # Remove known event room.forget('arrived') # no events based on 'someone arrived' will be fired ''' {{tag> event driven programming python micropython events library tutorial }} ~~DISCUSSION~~