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

Как правильнее записать код определения какую inline кнопку нажал пользователь?

Всем привет)
Есть динамическая система создания заданий, затем созданные создания сохраняются в БД, и когда пользователь в телеграм боте нажимает кнопку заданий
0NaKb7g.png
Путём цикла перебора я показываю пользователю все возможные задания в инлайн кнопках
kb_tasks = InlineKeyboardMarkup(row_width=1)
    for i in range(len(tasks)):
            btn_task = InlineKeyboardButton(f"{tasks[i][0]}", callback_data=f'task.{i}')
            kb_tasks.add(btn_task)
    await message.answer(f"<b>Задания доступные для вас\nЧто бы выбрать нажмите на интересующее</b>",
                         reply_markup=kb_tasks, parse_mode="html")

Тут я указываю для каждой кнопки коллбэк дата
callback_data=f'task.{i}
, т.е task.0, task.1 и так далее по их последовательности в БД
Теперь, я ловлю коллбэки таким образом
async def select_task(call: types.CallbackQuery):
    tasks = await sql.fetch("SELECT name FROM tasks")
    for i in range(len(tasks)):
        if call.data == f'task.{i}':
            await bot.send_message(call.message.chat.id, f"Ты выбрал задание №{i}")

Данный код работает исправно, но думаю что это неправильно
То есть каждый раз когда пользователь нажимает инлайн кнопку тоедело запускается цикл и проходит по всем коллбэкам = task.0, task.1 и так до кол-ва заданий в БД пока не найдет нужный, скажется ли это как нибудь на производительности бота? И как можно записать данный код по другому?
В плане производительности я не имею ввиду супер скорость, но думаю что если пользователей будет хотя бы 10 и заданий 20-30 то это будет жутко лагать
Извиняюсь заранее за большое кол-во текста, так как думаю что так будет понятнее что я хочу сделать
Возможно, написал бред и спрашиваю тоже бред, этого не исключаю)
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@twistfire92
Python backend developer
Лагать не будет. Мне кажется даже с обходом 1000 кнопок вы не увидете задержек.
Проблема в самом подходе.
Первое - вытаскивать все имена из БД чтобы потом посчитать сколько их было - ну такое себе. Гуглим SQL COUNT
Второе - если из строки task.8 нужно вытащить 8, то это проще сделать через split
call.data.split('.')[1]
И никакие циклы там не нужны (в данном случае и запрос в БД тоже не нужен).

Подучите больше основ чтобы не выполнять лишних действий.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
02 февр. 2025, в 17:00
350 руб./в час
02 февр. 2025, в 15:37
750000 руб./за проект