Перегрузка и модель стратегии
Я пытаюсь написать систему доставки электронной почты. У меня есть такое перечисление, для всех пользователей, пользователей, которые заходили в систему за последние 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()