Проблема с тг-ботом на pytelegramapi: не работает функция и не используются команды бота

Рейтинг: 0Ответов: 1Опубликовано: 22.04.2023

Пишу бота на pytelegramapi, но появилась одна проблема. Функция никак не может отработать и не получается использовать другие команды бота.

Подскажите, пожалуйста, в чём ошибка.

import math

import telebot
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def welcome(message):
    bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>, бот созданный чтобы решать уравнения разных степеней. Для начала использования введите комманду /list".format(message.from_user, bot.get_me()), parse_mode='html')

@bot.message_handler(commands=['2'])
def welcome(message):
    bot.send_message(message.chat.id, '''Для решения кубического уравнения типа: ax^2 + bx + c = 0, введите значения a, b и c в строчку, расставляя между ними знаки + и -!
Например для решения уравнения 5x^2 - 9x + 1
Введите 5-9+1
''')
    @bot.message_handler(func=lambda message: True)
    def stepen3(message):
        text = message.text
        k = text
        m = k.find(' ')
        number = m+1
        a = int(k[:m])
        k = k.replace(' ', '=', 1)
        m = k.find(' ')
        b = int(k[number:m])
        number = m+1
        k = k.replace(' ', '=', 1)
        m = k.find(' ')
        c = int(k[number:m])
        number = m+1
        k = k.replace(' ', '=', 1)
        d = int(k[number:])
        p = (3*a*c - b**2)/(3*a**2)
        q = (2*b**3 - 9*a*b*c + 27*a**2*d)/(27*a**3)
        discriminant = q**2/4 + p**3/27
        if discriminant > 0:
            r = -q/2 + math.sqrt(discriminant)
            s = -q/2 - math.sqrt(discriminant)
            u = r**(1/3) if r >= 0 else -(-r)**(1/3)
            v = s**(1/3) if s >= 0 else -(-s)**(1/3)
            x1 = u + v - b/(3*a)
            x2 = -(u + v)/2 - b/(3*a) + (u - v)*math.sqrt(3)/2j
            x3 = -(u + v)/2 - b/(3*a) - (u - v)*math.sqrt(3)/2j
            bot.send_message(message.chat.id, 'Уравнение имеет 1 реальный корень и два комплексных')
            bot.send_message(message.chat.id, 'Реальный корень')
            bot.send_message(message.chat.id, x1)
            bot.send_message(message.chat.id, 'Комплексные корни')
            bot.send_message(message.chat.id, x1)
            bot.send_message(message.chat.id, x2)
        elif discriminant == 0:
            if q >= 0:
                x1 = -2*q**(1/3) - b/(3*a)
                x2 = q**(1/3) - b/(3*a)
                bot.send_message(message.chat.id, 'Уравнение имеет 3 реальных корня, но два из них совпадают')
                bot.send_message(message.chat.id, x1)
                bot.send_message(message.chat.id, x2)
                bot.send_message(message.chat.id, x3)

            else:
                x1 = q**(1/3) - b/(3*a)
                x2 = x3 = -(q**(1/3) + b/(3*a))/2
                bot.send_message(message.chat.id, 'Уравнение имеет 3 реальных корня, но два из них совпадают')
                bot.send_message(message.chat.id, x1)
                bot.send_message(message.chat.id, x2)
                bot.send_message(message.chat.id, x3)
        else:
            alpha = (-q/2 + discriminant**(1/2))**(1/3)
            beta = (-q/2 - discriminant**(1/2))**(1/3)
            x1 = alpha + beta - b/(3*a)
            x2 = -(alpha + beta)/2 - b/(3*a) + (alpha - beta)*math.sqrt(3)/2j
            x3 = -(alpha + beta)/2 - b/(3*a) - (alpha - beta)*math.sqrt(3)/2j
            bot.send_message(message.chat.id, 'Уравнение имеет 3 реальных корня')
            bot.send_message(message.chat.id, x1)
            bot.send_message(message.chat.id, x2)
            bot.send_message(message.chat.id, x3)
bot.polling(none_stop=True)

Ответы

▲ 0

Если на словах:

Проблема заключается в том, что функция stepen3 определена внутри функции welcome, поэтому она не будет вызываться, пока не будет вызвана функция welcome. Чтобы исправить эту проблему, необходимо определить функцию stepen3 в глобальной области, как и другие функции-обработчики сообщений. (явные проблемы с отступами)

если кодом:

@bot.message_handler(func=lambda message: True)
def stepen3(message):
    text = message.text
    code  ...