Калькулятор Python TG BOT

Подскажите пожалуйста, как зациклить проверку введенных значений до ввода верного диапазона значений? Спасибо.

import telebot
bot = telebot.TeleBot("TOKEN")
    
@bot.message_handler(commands=['start'])      
def handle_text(message):
    numvan = bot.send_message(message.chat.id, 'Введите оклад по званию:⭐')
    bot.register_next_step_handler(numvan ,num1_fun)
    
def num1_fun(message):
    if int(message.text.isdigit()):
        if int(message.text) in range(7000, 35000):
            bot.send_message(message.chat.id, 'Пойдет ✅ {}'.format(message.text))
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
    bot.polling(none_stop=range)
    
    global num1;
    num1 = message.text  
    numtwo = bot.send_message(message.chat.id, 'Введите оклад по должности:?')
    bot.register_next_step_handler(numtwo ,num2_fun)
       
def num2_fun(message):
    if int(message.text.isdigit()):
        if int(message.text) in range(15000, 45000):
            bot.send_message(message.chat.id, 'Пойдет ✅ {}'.format(message.text))
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')
        bot.polling(none_stop=True)

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

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

Как зациклить проверку введенных значений?

Если условия возвращают False то register_next_step_handler на эту же функцию?‍♀️

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 num1_fun(message):
    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, 'Укажите верный оклад (от 7000 до 35000) ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')

    bot.register_next_step_handler(message, num1_fun)

def num2_fun(message):
    if message.text.isdigit():  
        salary = int(message.text)
        if 15000 <= salary <= 45000:  
            bot.send_message(message.chat.id, f'Пойдет ✅ {salary}')
            return  
        else:
            bot.send_message(message.chat.id, 'Укажите верный оклад (от 15000 до 45000) ?')
    else:
        bot.send_message(message.chat.id, 'Оклад должен быть числом ?')

    bot.register_next_step_handler(message, num2_fun)

bot.polling(none_stop=True)
  • .format(message.text) -> лучше заменить на f-строки -> f'Пойдет ✅ {salary}'

  • int(message.text.isdigit()) -> преобразовывать в int тут не нужно -> if message.text.isdigit(): - этого будет достаточно. (.isdigit() - возвращает True\False)

  • Генерировать все допустимые числа range(7000, 35000) - не целесообразно, ведь есть знаки равенства: 15000 <= salary <= 45000

  • Не обязательно сохранят ответ бота numtwo = bot.send_message(..) что бы передать его в bot.register_next_step_handler(message, num2_fun), можно просто в качестве параметра указать ранее принятое message.

  • bot.polling(none_stop=True) не нужно засовывать в каждую из функций, метод должен быть вызван один раз в самом конце вашего кода. Это основной цикл программы и он должен быть только один.

→ Ссылка