Задать вопрос
@NATASHA_PULIMET

Как правильно создать и разделить разные функции под одним хендлером?

Как правильно внедрять функции в зависимости от ответа пользователя? Предположим, у меня есть один hendler, клава и пару кнопок.

def welcom(message):
markup=types.ReplyKeyboardMarkup(resize_keyboard=True)

item1=types.KeyboardButton("О боте")
item2=types.KeyboardButton("Чем займёмся?")
markup.row(item1,  item2)
bot.send_message(message.chat.id,'Добрый день',reply_markup=markup)

И вот к примеру, надо сделать две функции по одной на кнопку. Первое, что приходит в голову это if:

if message.text = "О нас":
def blablabla(message):
#блок кода
else:
def blablabla2(message):
#блок кода

Либо ещё есть register_next_step.
Что будет сделать правильней? Пишите свои варианты (скорее всего мои полный треш).
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Читаем документацию и учимся использовать встроенные средства бот-библиотеки.
@bot.message_handler(func=lambda message: message.text == 'О нас')
def blabla1(message):
    ...  # тут логика реакции на сообщение "О нас"

@bot.message_handler(func=lambda message: message.text == 'Чем займёмся?')
def blabla2(message):
    ...  # тут логика реакции на сообщение "Чем займёмся?"

@bot.message_handler(func=lambda message: True)
def whatever(message):
    ...  # тут логика реакции на все остальные сообщения. Эта функция должна идти строго последней.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Redeve
Веб-макаке не хватит и 640гБ
Создайте один общий хендлер - точку входа для текстовых (всмысле - не для /команд) сообщений, которые не обработались другими хендлерами. И в словаре определите что за что должно отвечать

что-то типа такого
def text_handler(...): # <<<  этот хендлер регистрируем
    secondary_handlers = {
        "О нас": about_us,
        "Чем займемся?": whats_next,
        "текст": handler_for_text
    }
    if handler := secondary_handlers.get(message.text):
        handler(message)

def about_us(...): ... # < а эти нет
def whats_next(...): ...


удобство такого варианта - список и точку входа определяем в условном bot.py, а обработчики для них можно импортировать откуда угодно
Ответ написан
Комментировать
@glu-dimaz
def blablabla(message):
    #Код обработки функции blablabla

def blablabla2(message):
    #Код обработки функции blablabla2

if message.text = "О нас":
    message = 'qq World'
    blablabla(message)

else:
    message = 'qq World2'
    blablabla2(message)

можно заморочится с классами, и если это blablabla2 и blablabla - выполняют одну и туже роль, можно их объединить в 1 функцию
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы