Композиция и организация результата - 52AnTIMateria812/Plyer GitHub Wiki

Пиком реализации инфраструктуры проекта является композиция декораторов. Нам было необходимо не только перехватывать ошибки, но и профилировать время работы системных вызовов ОС.

Pipeline через композицию

В файле logic.py мы последовательно "навешиваем" несколько декораторов:

@timer
@safe_execute
def demo_notification():
    # отправка уведомления

Порядок (снизу вверх) имеет значение:

  1. Сначала [[safe_execute] пытается вызвать уведомление. Если функция платформы кидает ошибку, она ловится здесь.
  2. Затем @timer замеряет время выполнения всей цепочки от перехватчика до самого низкого уровня ОС и выводит в консоль (например, ⏱️ Время: 0.045123 секунд).

Важность @wraps

Чтобы при обилии декораторов функция [[demo_notification] не превратилась в безликое имя [[wrapper] (одна из частых ловушек Python), мы использовали functools.wraps. Этот микромеханизм сохраняет метаданные __name__ и __doc__, позволяя логгеру [[safe_execute] выводить в консоль правильное имя функции, а не строку "Ошибка в wrapper". Это и есть настоящая организация результата на профессиональном уровне.