@chtopisatsuda

Почему ошибка UnboundLocalError: local variable 'loginD' referenced before assignment?

Здраствуйте , ошибка:
UnboundLocalError: local variable 'loginD' referenced before assignment

Строки связанные с ошибкой:
records = cursor.fetchall()
    print("Всего строк:  ", len(records))
    print("Вывод каждой строки")
    for row in records:
        loginD = row[2]
        passwordD = row[3]
    d = Dnevnik(login=loginD, password=passwordD)


Вся функция homeworksss()
Сама функция:
@bot.message_handler(content_types=['text'])
def homeworkss(message):
    records = cursor.fetchall()
    print("Всего строк:  ", len(records))
    print("Вывод каждой строки")
    for row in records:
        loginD = row[2]
        passwordD = row[3]
    d = Dnevnik(login=loginD, password=passwordD)

    if message.text.lower() == ' домашняя работа':
        for mr in d.homework()['homework']:
            bot.send_message(message.chat.id, f"{' ' + mr[0] + ':'}\n{' ' + mr[1].translate({ord ('['): None}) + ':'}\n{'Было задано на: ' + mr[2].translate({ord ('['): None})}")
    if message.text.lower() == ' все оценки':
        for mr in d.marks():
            bot.send_message(message.chat.id, f"{' ' + mr[1] + ':'}\n{' ' + mr[2].translate({ord ('['): None})}")
        print('mr')
    if message.text.lower() == 'расписание':
        print(d.week())
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Вообще-то да, эту ошибку тут часто спрашивают, хотя она очень простая.
for row in records:
        loginD = row[2]
        passwordD = row[3]
d = Dnevnik(login=loginD, password=passwordD)

У тебя d создаётся после цикла, только для последнего значения loginD и passwordD.
Вопрос: что будет, если в records ничего нет?
Тело цикла не выполнится ни разу, переменные loginD и passwordD не будут определены. А ты дальше пытаешься их использовать, о чём питон и предупреждает.

Ну и да, код - какой-то бред.
1. Ты сначала делаешь records = cursor.fetchall(). Тем самым ты выбираешь все строки, возвращённые последним запросом, выполненным через cursor. При следующем вызове функции homeworkss() cursor уже не будет содержать строк (ты их все выбрал в прошлый раз). А следующий вызов может настать в любой момент, так как homeworkss() - обработчик события. Почему ты выполняешь запрос вне homeworkss()?
2. Зачем вообще перебирать строки таким циклом, который создаёт дневник только для последней строки? Если тебе нужна конкретная строка, то почему не выбрать запросом только её? Если тебе нужны все строки, почему ты создаёшь дневник только для одной?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы