Как передать переменную из register_next_step_handler в callback_query_handler?

Имеется код собранный из двух частей пользователя @Violet, но не хватает навыков объединить. Суть кода в том, что пользователь задает изначально по команде /name - имя. При повторном вызове команды через callback_query_handler появляется две кнопки, которые ведут к редактированию имеющегося имени по запросу Да/Нет:

@bot.message_handler(commands=['name'])
def welcome2(message):

    mesg = bot.send_message(message.chat.id,'Задайте имя')
    bot.register_next_step_handler(mesg,name)

def name(message, f=None):
    if f == 'inline':
        argument = 'text for example'
        return argument
    else:
        if db.get_nickname(message.from_user.id) == 'name':
            db.update_nickname(message.from_user.id, message.text)
            bot.send_message(message.chat.id, "Привет, " + str(db.get_nickname(message.from_user.id)) + ", Для навигации по боту пользуйся системными кнопками телеграма.")
        else:
            markup = types.InlineKeyboardMarkup(row_width=2)
            item1 = types.InlineKeyboardButton("Да", callback_data='yes')
            item2 = types.InlineKeyboardButton("Нет", callback_data='no')
            markup.add(item1, item2)
            bot.send_message(message.chat.id, "Меняешь имя?", reply_markup=markup)


 @bot.callback_query_handler(func=lambda call: True)
    def callback_inline(call):
        try:
            if call.message:
                if call.data == 'yes':
                    # bot.send_message(call.message.chat.id, 'Вы успешно поменяли имя!')
                    print('argument = ' + name(None, 'inline'))
    
                elif call.data == 'no':
                    bot.send_message(call.message.chat.id, 'Вы не поменяли имя' ,disable_notification=True)
        except Exception as e:
            print(repr(e))

Переменную argument я получаю и передаю в callback - yes, но как ловить из register_next_step_handler имя, которое передается например в db.update_nickname, но только уже при call-yes?


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

Автор решения: Violet

воспользуйтесь передачей необходимой информации через callback_data:

item1 = types.InlineKeyboardButton("Да", callback_data="['yes', '" + message.chat.id + "', '" + message.text + "']"

далее эту информацию можно получить через ast.literal_eval:

if call.data.startswith("['yes'"):
   db.update_nickname(ast.literal_eval(call.data)[1], ast.literal_eval(call.data)[2])

https://ru.stackoverflow.com/a/1307896/234134

→ Ссылка
Автор решения: anton k

если

callback_data="['yes', '" + message.chat.id + "', '" + message.text + "']"

то при выводе (call.data)[1] и (call.data)[2] получим [ и '

→ Ссылка