Калькулятор по 4 переменным Puthon TG BOT

Подскажите пожалуйста, почему не выполняется 5 функция и правильно ли я присваиваю глобальные переменные?

def num1_fun(message):
    bot.send_message(message.chat.id, 'Введите оклад по званию:⭐')
    bot.register_next_step_handler(message, num1_fun)
    
def num1_fun(message):
    global num1;
    num1 = num1_fun
    if message.text.isdigit():  
        salary = int(message.text)
        if 7000 <= salary <= 35000:  
            bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
            bot.send_message(message.chat.id, 'Введите оклад по должности:?')
            bot.register_next_step_handler(message, num2_fun)
            return
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
    
    bot.register_next_step_handler(message, num1_fun)
    
    
def num2_fun(message):
    global num2;
    num2 = num2_fun
    if message.text.isdigit():  
        salary = int(message.text)
        if 15000 <= salary <= 45000:  
            bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
            bot.send_message(message.chat.id, 'Ведите процентную надбавку за выслугу лет к окладам денежного содержания в процентах:?')
            bot.register_next_step_handler(message, num3_fun)
            return
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
    
    bot.register_next_step_handler(message, num2_fun)
    
def num3_fun(message):
    global num3;
    num3 = num3_fun
    if message.text.isdigit():  
        salary = int(message.text)
        if 1000 <= salary <= 4000:  
            bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
            bot.send_message(message.chat.id, 'Размер пенсии в зависимости от выслуги лет в процентах:?')
            bot.register_next_step_handler(message, num4_fun)
            return
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
    
    bot.register_next_step_handler(message, num3_fun)
    
def num4_fun(message):
    global num4;
    num4 = num4_fun
    if message.text.isdigit():  
        salary = int(message.text)
        if 100 <= salary <= 400:  
            bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
            bot.register_next_step_handler(message, num5_fun)
            return
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
    
    bot.register_next_step_handler(message, num4_fun)
    
def num5_fun(message):
    A = num1 + num2
    B = A * int(num3) / 100
    X = A + B
    C = X * 0.8932
    B = C * int(num4) / 100
    bot.send_message(message.chat.id,B)
    bot.send_message(message.chat.id,"Повторить? /start")

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

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

Связанные ответы: один, два, три.

Начнём с того, что использовать глобальные переменные в данном примере не стоит. Если ботом будут пользовать больше чем 1 человек, то num1, num2, num3, num4 будут общими для всех пользователей, что приведёт к непредсказуемому результату.

Вместо этого, можно передавать словарь с данными между последующими вызовами: bot.register_next_step_handler(message, lambda msg: func(msg, data))

Так же можно не дублировать общую часть проверок, а вынести всё в декоратор.

Код:

import telebot
bot = telebot.TeleBot("TOKEN")


@bot.message_handler(commands=['start']) 
def handle_text(message):
    bot.send_message(message.chat.id, 'Введите оклад по званию:⭐')
    bot.register_next_step_handler(message, num1_fun)
    
def validate_input(min_value, max_value):
    def decorator(func):
        def wrapper(message, *args, **kwargs):
            if message.text.isdigit():
                salary = int(message.text)
                if min_value <= salary <= max_value:
                    bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
                    return func(message, *args, **kwargs)
                else:
                    bot.send_message(message.chat.id, 'Укажите верный оклад ?')
            else:
                bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
            bot.register_next_step_handler(message, lambda msg: wrapper(msg, *args, **kwargs))
        return wrapper
    return decorator

def next_step(message, func, data):
    bot.register_next_step_handler(message, lambda msg: func(msg, data))

@validate_input(7000, 35000)
def num1_fun(message):
    data = {}
    data['num1'] = int(message.text)
    bot.send_message(message.chat.id, 'Введите оклад по должности:?')
    next_step(message, num2_fun, data)

@validate_input(15000, 45000)
def num2_fun(message, data):
    data['num2'] = int(message.text)
    bot.send_message(message.chat.id, 'Ведите процентную надбавку за выслугу лет к окладам денежного содержания в процентах:?')
    next_step(message, num3_fun, data)

@validate_input(1000, 4000)
def num3_fun(message, data):
    data['num3'] = int(message.text)
    bot.send_message(message.chat.id, 'Размер пенсии в зависимости от выслуги лет в процентах:?')
    next_step(message, num4_fun, data)

@validate_input(100, 400)
def num4_fun(message, data):
    data['num4'] = int(message.text)
    num5_fun(message, data)
    
def num5_fun(message, data):
    num1 = data['num1']
    num2 = data['num2']
    num3 = data['num3']
    num4 = data['num4']
    
    # Расчет значений
    A = num1 + num2
    B = A * num3 / 100
    X = A + B
    C = X * 0.8932
    result = C * num4 / 100  
    
    bot.send_message(message.chat.id, f'Результат: {result:.2f}')
    bot.send_message(message.chat.id, "Повторить? /start")
    
bot.polling(none_stop=True)

введите сюда описание изображения

→ Ссылка