Поиск метода для сокращения условий выбора
пытаюсь реализовать бота на Python 3.10 при помощи библиотеки pyTelegramBotApi(telebot). У меня есть in-line-клавиатура, но в обработчике handler условия elif занимают много места. Подскажите, как можно упростить код?
import telebot
from functions_line import *
from Logos import *
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
bot = telebot.TeleBot("TOKEN")
@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.send_photo(message.chat.id, LOGOS['NTBVAPE'], caption = '?Добро пожаловать в нашего бота!?\nВыберите одного из производителей:', reply_markup = Product_from_keyboard())
@bot.callback_query_handler(func=lambda call: True)
def callback_query(call):
if call.data == "NEZAVOD":
bot.answer_callback_query(call.id, "Принято! Выбран производитель НЕЗАВОД")
msg = bot.send_photo(call.message.chat.id, LOGOS['NEZAVOD'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "GRADEVAPE":
bot.answer_callback_query(call.id, "Принято! Выбран производитель GRADE VAPE")
bot.send_photo(call.message.chat.id, LOGOS['GRADEVAPE'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "HOTSPOT":
bot.answer_callback_query(call.id, "Принято! Выбран производитель HOTSPOT")
bot.send_photo(call.message.chat.id, LOGOS['HOTSPOT'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "TRAINLAB":
bot.answer_callback_query(call.id, "Принято! Выбран производитель TRAIN LAB & ЖМЫХ LABS ")
bot.send_photo(call.message.chat.id, LOGOS['TRAINLAB'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "SK":
bot.answer_callback_query(call.id, "Принято! Выбран производитель SK (SK-360, SKAI) ")
bot.send_photo(call.message.chat.id, LOGOS['SK'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "GANGLIQUIDS":
date = bot.answer_callback_query(call.id, "Принято! Выбран производитель GANGLIQUIDS")
bot.send_photo(call.message.chat.id, LOGOS['GANGLIQUIDS'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
elif call.data == "DARKVAPELAB":
bot.answer_callback_query(call.id, "Принято! Выбран производитель DARKVAPELAB")
bot.send_photo(call.message.chat.id, LOGOS['DARKVAPELAB'] ,caption = "Выберите линейку жидкостей ", reply_markup= XYLINET_LINE())
#Выбор линеек жидкостей
elif call.data == "XNCOLD":
bot.answer_callback_query(call.id, "Принято! XYLINET COLD")
elif call.data == "XNCLASSIC":
bot.answer_callback_query(call.id, "Принято! XYLINET CLASSIC")
#######################################################################
elif call.data == "FRCLASSIC":
bot.answer_callback_query(call.id, "Принято! XYLINET COLDE")
elif call.data == "FRX":
bot.answer_callback_query(call.id, "Принято! XYLINET CLASSICR")
#######################################################################
bot.infinity_polling()
Ответы (1 шт):
Автор решения: Amgarak
→ Ссылка
Можно пойти в сторону словаря и сделать примерно так:
actions = {
"NEZAVOD": ("Принято! Выбран производитель НЕЗАВОД", LOGOS['NEZAVOD']),
"GRADEVAPE": ("Принято! Выбран производитель GRADE VAPE", LOGOS['GRADEVAPE']),
"HOTSPOT": ("Принято! Выбран производитель HOTSPOT", LOGOS['HOTSPOT']),
"TRAINLAB": ("Принято! Выбран производитель TRAIN LAB & ЖМЫХ LABS ", LOGOS['TRAINLAB']),
"SK": ("Принято! Выбран производитель SK (SK-360, SKAI) ", LOGOS['SK']),
"GANGLIQUIDS": ("Принято! Выбран производитель GANGLIQUIDS", LOGOS['GANGLIQUIDS']),
"DARKVAPELAB": ("Принято! Выбран производитель DARKVAPELAB", LOGOS['DARKVAPELAB']),
"XNCOLD": ("Принято! XYLINET COLD", None),
"XNCLASSIC": ("Принято! XYLINET CLASSIC", None),
"FRCLASSIC": ("Принято! XYLINET COLDE", None),
"FRX": ("Принято! XYLINET CLASSICR", None),
}
def process_callback(call):
message, photo = actions[call.data]
bot.answer_callback_query(call.id, message)
if photo:
bot.send_photo(call.message.chat.id, photo, caption=message, reply_markup=XYLINET_LINE())
for data in actions.keys()
if call.data == data:
process_callback(call)