Перегрузка и модель стратегии

Я пытаюсь написать систему доставки электронной почты. У меня есть такое перечисление, для всех пользователей, пользователей, которые заходили в систему за последние 3 месяца и 6 месяцев:

class Receiver(enum.Enum):
    ALL = "ALL"
    THREE_MONTHS = "THREE_MONTHS"
    SIX_MONTHS = "SIX_MONTHS"

Проблема в том, что я пытаюсь реализовать паттерн Strategy pattern, поэтому мне нужно усилить проверку типов. Я знаю, что по умолчанию это невозможно, но ... любая идея будет оценена по достоинству.

Мне нужно, чтобы это выглядело так:

def send_to(Receiver.ALL):
    pass

def send_to(Receiver.THREE_MONTHS):
    pass

def send_to(Receiver.SIX_MONTHS):
    pass

Да, у меня есть Java background.

И общий отправитель передаст значение соответственно:

@api_view(["POST"])
def send_email(request):
        email_to = request.data["emailTo"]
        send_to(email_to)

Примечание: Я не хочу писать несколько проверок if или случаев switch. Это полностью противоречит принципу Open Closed дядюшки Боба, так как если будет дополнительный случай, то метод должен быть изменен. Абсолютно неприемлемо.

В Python нет перегрузки функций. Что у него есть, так это объекты функций первого класса.

Создайте dict, который сопоставляет Receiver значения с соответствующей функцией.

def send_to_all():
    pass

def send_to_last_three_months():
    pass

def send_to_last_six_months():
    pass

senders = {
    Receiver.ALL: send_to_all,
    Receiver.THREE_MONTHS: send_to_last_three_months,
    Receiver.SIX_MONTHS: send_to_last_six_months,
}

@api_view(["POST"])
def send_email(request):
    email_to = request.data["emailTo"]
    sender = senders[email_to]
    sender()
Вернуться на верх