Правильно ли построена функция публикации сообщения telebot?

я создаю бота на python telebot для пересылки сообщений с помощью copy_message. Появился вопрос, правильно ли у меня построена функция publish, потому что большое количество return кажется мне совершенно неправильным решением. Если неправильно, то укажите как именно стоит её реализовать.

# Handler for messages send by an ordinary user
@bot.message_handler(content_types=allowed_types)
def publish(message):
    create_db()
    if not check_for_user_existence(message.from_user.id):
        add_new_user_to_db(message)
    elif check_user_for_blocking(message.from_user.id):
        bot.send_message(message.chat.id, 'Вы были заблокированы администратором. Если Вы считаете, что блокировка несправедлива, то пишите @username')
        return
    elif message.date < acceptable_time:
        bot.send_message(message.chat.id, f'Администратор заблокировал отправку сообщений до {datetime.fromtimestamp(acceptable_time).strftime('%H:%M:%S %d/%m/%Y')}')
        return
    elif not check_time_for_sending(message):
        bot.send_message(message.chat.id, 'Вы недавно отправляли сообщение, подождите ещё')
        return
    # Sending message, saving to value, adding it to the database and notifying user about it
    msg = bot.copy_message(channel_id, message.chat.id, message.message_id)
    add_new_message_to_db(message, msg.message_id)
    bot.send_message(message.chat.id, 'Ваше сообщение успешно отправлено')

Ответы (1 шт):

Автор решения: CrazyElf
    if not check_for_user_existence(message.from_user.id):
        add_new_user_to_db(message)
    elif check_user_for_blocking(message.from_user.id):
        bot.send_message(message.chat.id, 'Вы были заблокированы администратором. Если Вы считаете, что блокировка несправедлива, то пишите @username')
        return
    elif message.date < acceptable_time:
        bot.send_message(message.chat.id, f'Администратор заблокировал отправку сообщений до {datetime.fromtimestamp(acceptable_time).strftime('%H:%M:%S %d/%m/%Y')}')
        return
    elif not check_time_for_sending(message):
        bot.send_message(message.chat.id, 'Вы недавно отправляли сообщение, подождите ещё')
        return

Я бы предложил рефакторинг этого куска: вынести этот развесистый if в отдельную функцию, которая будет возвращать message, и если этот message не пустой (и не None), тогда отсылаем его и делаем return:

def check_message(message):
    if not check_for_user_existence(message.from_user.id):
        add_new_user_to_db(message)
    elif check_user_for_blocking(message.from_user.id):
        return 'Вы были заблокированы администратором. Если Вы считаете, что блокировка несправедлива, то пишите @username'
    elif message.date < acceptable_time:
        return f'Администратор заблокировал отправку сообщений до {datetime.fromtimestamp(acceptable_time).strftime('%H:%M:%S %d/%m/%Y')}'
    elif not check_time_for_sending(message):
        return 'Вы недавно отправляли сообщение, подождите ещё'

...
def publish(message):
    create_db()
    result = check_message(message)
    if result:
        bot.send_message(message.chat.id, result)
        return

Кода не стало меньше, но проверки были выделены в отдельную функцию, в них уменьшилась повторяемость кода. Ну и сама функция публикации стала короче и понятнее.

→ Ссылка