Ломается код через некоторое время python

link = "ссылка"
check = "false"


def send_message(message):
    token = "токен"
    chat_id = "чат айди"
    url = f"https://api.telegram.org/bot{token}/sendMessage?chat_id={chat_id}&parse_mode=html&text=<b>{message}</b>"
    requests.get(url).json()


def check_alert(alert):
    dt = datetime.datetime.now().strftime("%H:%M")
    global check

    if alert == "True" and check == "false":
        send_message(f"{dt} Сообщение какое-то")
        check = "true"
    elif alert == "False" and check == "true":
        send_message(f"{dt} Сообщение какое-то")
        check = "false"
    else:
        print(f"Сообщение какое-то= {alert}") #Type alert = False / Type alert = True
    get_alert()


def get_alert():
    while True:
        try:
            response = requests.get(link)
            response_json = response.json()
            typeAlert = response_json["states"]["...."]["enabled"]
        except Exception:
            time.sleep(300)

        time.sleep(5)
        check_alert(typeAlert)


get_alert()

Ломаю голову целый день(новичок)

Есть код(не спрашивайте какой в нем смысл, некоторую информацию, которая не играет роль - скрыл)

Я получаю данные через API через одну функцию. В ней вызываю вторую функцию, где проходит проверка полученного значения по API. Если значение равно тому то тому то - то выполняется определенные действия, одно из них - вызов третьей функции, где я передаю значение и потом это же значение публикуется в телеграм канале. Заметьте, что функция get_alert() бесконечная(должна быть), т.е получаю данные каждые 5 секунд.

Так вот, по началу все работает идеально, никаких нареканий нет, но потом через, возможно, минут 3-4 появляются ошибки(Traceback (most recent call last)), и в следствии чего, код стопается. Вот скрин:введите сюда описание изображения

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

Строки нет смысла считать, тут есть неважные абсолютно строчки кода, который я удалил.

Надеюсь на вашу помощь и жду идеи, как решить проблему!!!!


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

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

IDE печатает вам причину падения - local variable 'typeAlert' referenced before assignment

Ваша переменная typeAlert существует только внутри try / except. Измените ее область видимости. Например так

def get_alert():
while True:
    typeAlert = *что-то*
    try:
        response = requests.get(link)
        response_json = response.json()
        typeAlert = response_json["states"]["...."]["enabled"]
    except Exception:
        time.sleep(300)

    time.sleep(5)
    if typeAlert != *чему-то*:
       check_alert(typeAlert)
→ Ссылка
Автор решения: mrBars1k

Предполагаю, что проблема в лимите рекурсии. Стандартный лимит рекурсии в python не более тысячи повторений.

У вас одна функция вызывает вторую и наоборот, и так по кругу. Всё работает какое-то время исправно, значит проблема вряд ли в переменных или мелочах.

Простой пример ошибки из-за лимита рекурсии:

def first():
    second()

def second():
    print('Проверка')
    first()
    
first()

Сначала код выполняется, затем выходит за лимит рекурсии и перестаёт.

Если данный пример изменить на:

def first():
    while True:
        second()

def second():
    print('Проверка')

first()

То всё будет работать бесконечно так, как это уже не рекурсия.

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

→ Ссылка