Калькулятор по 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)