> Как структурировать уведомления (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Международный аэропорт Шереметьево

Стек: Python

> Пример ответа

Для структурирования уведомлений в бэкенде на Python я предлагаю использовать паттерн "Стратегия" в сочетании с фабрикой каналов доставки. Основная идея - разделить логику генерации уведомлений, их форматирования и отправки.

Пример реализации:

PYTHON
from abc import ABC, abstractmethod
from dataclasses import dataclass
from enum import Enum
from typing import List, Optional
class NotificationType(Enum):
EMAIL = "email"
SMS = "sms"
PUSH = "push"
@dataclass
class Notification:
recipient: str
title: str
body: str
type: NotificationType
metadata: Optional[dict] = None
class NotificationChannel(ABC):
@abstractmethod
def send(self, notification: Notification) -> bool:
pass
class EmailChannel(NotificationChannel):
def send(self, notification: Notification) -> bool:
# Логика отправки email через SMTP/API
print(f"Sending email to {notification.recipient}: {notification.title}")
return True
class SMSChannel(NotificationChannel):
def send(self, notification: Notification) -> bool:
# Логика отправки SMS через сторонний сервис
print(f"Sending SMS to {notification.recipient}: {notification.body}")
return True
class PushChannel(NotificationChannel):
def send(self, notification: Notification) -> bool:
# Логика отправки push-уведомления через Firebase/APNs
print(f"Sending push to {notification.recipient}: {notification.title}")
return True
class NotificationService:
def __init__(self):
self.channels = {
NotificationType.EMAIL: EmailChannel(),
NotificationType.SMS: SMSChannel(),
NotificationType.PUSH: PushChannel(),
}
def send_notification(self, notification: Notification) -> bool:
channel = self.channels.get(notification.type)
if not channel:
raise ValueError(f"Unsupported notification type: {notification.type}")
return channel.send(notification)
def send_bulk(self, notifications: List[Notification]) -> List[bool]:
results = []
for notif in notifications:
results.append(self.send_notification(notif))
return results

Ключевые принципы:

  • Единая структура данных - класс Notification инкапсулирует все поля.
  • Интерфейс канала - каждый канал реализует send(), что упрощает добавление новых типов (Telegram, Slack).
  • Фабрика каналов - NotificationService выбирает нужный канал по типу.
  • Расширяемость - для добавления нового канала достаточно создать класс и зарегистрировать его в словаре.

Для сложных сценариев (шаблоны, приоритеты, очереди) можно добавить:

  • Шаблонизатор (Jinja2) для генерации тела уведомления.
  • Очередь задач (Celery/RQ) для асинхронной отправки.
  • Логирование и мониторинг через декораторы или middleware.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью