Вынесение создания кнопок KeyboardButton

Пишу бота в телеграмме используя библеотеку pyTelegramBotAPI. Есть несколько функции, в которых создаются одни и те же кнопки.

@bot.message_handler(regexp="Настройки")
def settings(message):
    button01_settings = types.KeyboardButton("Кнопка1")
    button02_settings = types.KeyboardButton("Кнопка2")
    button03_settings = types.KeyboardButton("Кнопка3")
    button04_settings = types.KeyboardButton("Кнопка4")
    button05_settings = types.KeyboardButton("Назад")
    markup_settings = types.ReplyKeyboardMarkup(resize_keyboard=True).add(button01_settings,button02_settings)
    markup_settings.add(button03_settings,button04_settings)
    markup_settings.add(button05_settings)
    bot.send_message(message.chat.id, "Вы перешли в настройки",reply_markup=markup_settings)

@bot.message_handler(content_types=['text'])
def main_start(message):
    if message.text in list_commands:
         ...
    else:
         button01_settings = types.KeyboardButton("Кнопка1")
         button02_settings = types.KeyboardButton("Кнопка2")
         button03_settings = types.KeyboardButton("Кнопка3")
         button04_settings = types.KeyboardButton("Кнопка4")
         button05_settings = types.KeyboardButton("Назад")
         markup_settings = types.ReplyKeyboardMarkup(resize_keyboard=True).add(button01_settings,button02_settings)
         markup_settings.add(button03_settings,button04_settings)
         markup_settings.add(button05_settings)
         bot.send_message(message.chat.id, "Вы перешли в настройки",reply_markup=markup_settings)

Есть ли смысл выносить создание кнопок из функции? Будет ли это более оптимизирование? Типо так:

button01_settings = types.KeyboardButton("Кнопка1")
button02_settings = types.KeyboardButton("Кнопка2")
button03_settings = types.KeyboardButton("Кнопка3")
button04_settings = types.KeyboardButton("Кнопка4")
button05_settings = types.KeyboardButton("Назад")
markup_settings = types.ReplyKeyboardMarkup(resize_keyboard=True).add(button01_settings,button02_settings)
markup_settings.add(button03_settings,button04_settings)
markup_settings.add(button05_settings)

@bot.message_handler(regexp="Настройки")
def settings(message):
    bot.send_message(message.chat.id, "Вы перешли в настройки",reply_markup=markup_settings)

@bot.message_handler(content_types=['text'])
def main_start(message):
    if message.text in list_commands:
         ...
    else:
         bot.send_message(message.chat.id, "Вы перешли в настройки",reply_markup=markup_settings)



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

Автор решения: Mark Liman

мне кажется в вашем случае есть смысл не столько в отдельную функцию их выводить, сколько создать кнопки в меню и просто возвращать после события в методе обратно в меню без кнопки назад на пример:

@bot.message_handler(content_types=['start'])
def menu(message):
    button01 = types.KeyboardButton("Кнопка1")
    button02 = types.KeyboardButton("Кнопка2")
    markup.add(button01, button02)
    bot.send_message(message.chat.id, text="Привет, {0.first_name}! добро пожаловать в меню".format(message.from_user), reply_markup=markup)

@bot.message_handler(content_types=['text'])
def func(message):
    if message.text in list_commands:
         bot.register_next_step_handler(message, primer_sobitia)

def primer_sobitia(message):
    # сюда функционал 
    bot.register_next_step_handler(message, menu) # вернет вас в меню

при желании если должно произойти несколько событий, то пользуйтесь

bot.register_next_step_handler(message, следующая функция)

так-же если так будет удобнее, то добавить кнопку back.

→ Ссылка