loading...

Fast Pub-Sub python implementation: starting (I)

mandrewcito profile image Andrés Baamonde Lozano Updated on ・1 min read

A brief explanation

First, before start coding. You must read this, a good article that explains the difference between a publish subscribe and an observer. If you don't want read this article, I think that this graphic will be enough
pub sub vs. observer

As we can see in this graphic, an subscriber(callback function) will be attached to an event. Once this step completed, a publisher will add to the event channel a new event firing all the subscribers attached to that event.

Our class

class EventChannel(object):
    def __init__(self):
        self.subscribers = {}

    def unsubscribe(self, event, callback):
        if event is not None or event != ""\
                and event in self.subscribers.keys():
            self.subscribers[event] = list(
                filter(
                    lambda x: x is not callback,
                    self.subscribers[event]
                )
            )

    def subscribe(self, event, callback):
        if not callable(callback):
            raise ValueError("callback must be callable")

        if event is None or event == "":
            raise ValueError("Event cant be empty")

        if event not in self.subscribers.keys():
            self.subscribers[event] = [callback]
        else:
            self.subscribers[event].append(callback)

    def publish(self, event, args):
        if event in self.subscribers.keys():
            for callback in self.subscribers[event]:
                callback(args)

Testing

event_channel = EventChannel()

callback = lambda x: print(x)

event_channel.subscribe("myevent", callback)

event_channel.publish("myevent", "Hello, world!")

# out: "Hello, world!"

event_channel.unsubscribe("myevent", callback)

bus_instance.publish("myevent", "Hello, world!")

# No output

Links

Wich things will you improve?.Thank you for reading, and write any thought below :D

Posted on by:

Discussion

pic
Editor guide