Описание структуры из нескольких функций в Python

У меня в проекте требовалось при некоем событии вызывать соответствующий ему обработчик. Было это реализовано с помощью декораторов:

@on_event('sample_event')
def sample_handler():
    pass # handle event

Теперь появилась необходимость вызывать два обработчика. При первом обнаружении события - "init", при всех остальных - "all" Встал вопрос как это все оформить по всем правилам питона

Из вариантов:

1. Создать два разных обработчика

@on_event_init('sample_event')
def sample_handler_init():
    pass # handle first event

@on_event_all('sample_event')
def sample_handler_all():
    pass # handle regular event

Самый очевидный вариант. Но мне бы хотелось, чтобы обработчики для одного события были сгруппированы (для лучшей читаемости кода). Так что:

2. Вложить инициализацию в основной обработчик

@on_event('sample_event')
def sample_handler():
    def init():
        pass # handle first event
    pass # handle regular event

3. Вложить все методы в основной обработчик

@on_event('sample_event')
def sample_handler():
    def init():
        pass # handle first event
    def all():
        pass # handle regular event

В вариантах 2 и 3 не понятно как вызывать функции извне, да и вообще это не выглядит как хорошая идея. Так что появился 4 вариант:

4. Обернуть обработчики в класс

class SampleEvent(Event):
    # __init__() определен в родительском классе для регистрации объекта

    def init(self):
        pass # handle first event
    def all(self):
        pass # handle regular event

SampleEvent()

С одной стороны это решает проблему с группировкой и внешними вызовами. Но мне не нравится идея создавать отдельный класс для единичного объекта. В идеале хотелось бы что-то вроде структуры из функций

Есть ли какие-нибудь еще варианты? Как мне стоит поступить?


Ответы (1 шт):

Автор решения: Kers

Изначально все же склоняюсь к варианту с классом как более удобному. При этом сделав методы статическими чтобы не создавать каждый раз экземпляр класса.

Но как вариант можно еще сделать реализацию аналог swith:

def fun1():
    print("fun1")

def fun2():
    print("fun2")

def sample_event(operator):
    return {
        "event1": fun1,
        "event2": fun2,
    }.get(operator)()


sample_event("event1") 
→ Ссылка