Правильно ли построена функция публикации сообщения 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
Кода не стало меньше, но проверки были выделены в отдельную функцию, в них уменьшилась повторяемость кода. Ну и сама функция публикации стала короче и понятнее.