Python - function overloading with singledispatch


Python tip:

You can use singledispatch to implement different (re)actions based on the first function's argument type

For each type, you register an overloaded implementation

For example, you can handle different events like so:

from functools import singledispatch


class Event:
    pass


class UserSignedUp(Event):
    def __init__(self, email):
        self.email = email


class CustomerCanceledSubscription(Event):
    def __init__(self, email):
        self.email = email


@singledispatch
def handle_event(event: Event):
    pass  # do nothing


@handle_event.register(UserSignedUp)
def _(event: UserSignedUp):
    print(f"I will prepare resources for newly signed up user: {event.email}")


@handle_event.register(CustomerCanceledSubscription)
def _(event: CustomerCanceledSubscription):
    print(f"I will disable resources for customer:  {event.email}")


events = [
    UserSignedUp(email="[email protected]"),
    CustomerCanceledSubscription(email="[email protected]"),
]

for event in events:
    handle_event(event)

# I will prepare resources for newly signed up user: [email protected]
# I will disable resources for customer:  [email protected]