Описание структуры из нескольких функций в 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 шт):
Изначально все же склоняюсь к варианту с классом как более удобному. При этом сделав методы статическими чтобы не создавать каждый раз экземпляр класса.
Но как вариант можно еще сделать реализацию аналог swith:
def fun1():
print("fun1")
def fun2():
print("fun2")
def sample_event(operator):
return {
"event1": fun1,
"event2": fun2,
}.get(operator)()
sample_event("event1")