Мне действительно нужно объявить переменную как пустую, прежде чем использовать ее в операторе if? - PullRequest
0 голосов
/ 28 апреля 2020

так что я новичок ie на этом уровне кодирования. Я имею в виду, что, очевидно, я очень хорошо понимаю основы, но я дошел до того, что постепенно строю бэкэнд-код для веб-приложения с высокими требованиями к базе данных, пользователи и т. Д. c. Я учусь самостоятельно, и мой код может быть не идеальным или не соответствовать некоторым хорошо принятым соглашениям, но сам код на 100% функционален. Это действительно хорошо, для чего он предназначен. Тем не менее, я продолжаю сталкиваться с небольшой проблемой, которую я не понимаю.

По какой-то причине я должен объявить мою локальную переменную old_email как None, прежде чем я смогу использовать ее в операторе if. В противном случае, если я пытаюсь объявить переменную внутри оператора if, он продолжает выдавать мне следующее сообщение об ошибке в PyCharm:

«На локальную переменную« old_email »можно ссылаться до назначения»

Я понимаю что здесь что-то происходит с областью действия, но мне кажется немного странным, что мне пришлось бы объявить переменную как None, прежде чем я смогу ее использовать. Простое объявление в верхней части моей функции не так уж важно, но моя интуиция говорит мне, что, вероятно, есть лучший способ сделать это. Я что-то здесь упускаю?

Вот одна из функций, которая имеет эту проблему. Также имейте в виду, что эта функция иногда вызывает другие простые функции, которые проверяют достоверность данных.

def change_email(new_email, user_id):
    old_email = None
    get_email = db.execute("SELECT email FROM user WHERE id = ?", (user_id, ))
    if get_email.fetchone() is None:
        new_email_is_valid = False
        message = "User ID does not exist" 
        # It is probably impossible for the user to cause this issue. The goal here is to 
        # avoid internal errors or make the app crash.
        return new_email_is_valid, message
    else:
        for row in get_email:
            old_email = row[0]
        if equal_values(new_email, old_email):
            new_email_is_valid = False
            message = "This is already your email address"
            return new_email_is_valid, message
        elif not match(r"[^@]+@[^@]+\.[^@]+", new_email):
            new_email_is_valid = False
            message = "This is not a valid email address"
            return new_email_is_valid, message
        elif length_validity(new_email) is False:
            new_email_is_valid = False
            message = "Invalid format"
            return new_email_is_valid, message
        elif is_blank(new_email):
            new_email_is_valid = False
            message = "The field can't be left blank"
            return new_email_is_valid, message
        else:
            new_email_is_valid = True
            message = "Email address changed successfully"
            db.execute("UPDATE user SET email = ? WHERE id = ?", (new_email, user_id))
            conn.commit()
            return new_email_is_valid, message
...