Функция входа в систему создает ошибку ключа, когда имя пользователя не существует — Python

#python #python-3.x

#python #python-3.x

Вопрос:

Я создаю игру, которая начинается с функции входа в систему

Пользователь может «войти в систему (A) или создать учетную запись (B)»

Моя проблема в том, что если пользователь входит в систему с именем пользователя, которого не существует, я получаю ошибку ключа: «(независимо от имени пользователя, которое они ввели)»

Отображается полная ошибка

Ожидаемый результат: я бы хотел, чтобы код выводил «Пользователь не существует», если это произойдет.

Проблема может быть воспроизведена с помощью этого кода и ввода «A» для входа в систему и ввода случайного имени пользователя, которого не существует.

 users = {} # Currently empty list called Users. Stores all log ins
global status
status = ""

def LogIn():#Function is called Log In. Can be called at any time.
    status = input("Log in (A) or Create an account(B) - Enter 'A' or 'B' ")   # asks for log in information
    status = status.upper()
    if status == "A":
        oldUser() #Already has an account
    elif status == "B":
        newUser() #Would like to make a new account
        return status #Moves on to the function named status

def newUser(): # Creating an account.
    CreateUsername = input("Create username: ") #Enter a what your username is

    if CreateUsername in users: # check if login name exists in the list
        print ("n Username already exists!n")
    else:
        createPassw = input("Create password: ")
        users[CreateUsername] = createPassw # add login and password
        print("nUser created!n")     

def oldUser():
    username = input("Enter username: ")
    passw = input("Enter password: ")

    # check if user exists and login matches password
    if passw == users[username]:
      print ("Login successful!n")
      print('Game begins')
    else:
        print ("nUser doesn't exist or wrong password!n")

while status != "q":            
    status = LogIn()
  

Дополнительная информация: больше контекста того, как работает функция входа в систему.
Больше контекста

Комментарии:

1. Во-первых, вы должны включить сообщение об ошибке в вопрос, а не в изображение. (обычно это включается в блок кода)

2. Что касается вопроса — похоже, вы знаете, как проверить, находится ли ключ в dict. Так что просто сделайте это перед доступом к ключу.

3. Это логическая ошибка. Я думаю, это происходит, когда пользователь решает войти в систему для пользователя, который еще не существует.

4. @ScottBoston Спасибо, теперь это работает

Ответ №1:

Вы получаете сообщение об ошибке, потому что пытаетесь получить доступ к users словарю с помощью ключа, которого нет в словаре. Используемый вами ключ — это имя пользователя пользователя. Поэтому, когда в словаре нет пользователя с этим именем пользователя, вы получаете KeyError

Альтернативой использованию try и except было бы реструктурировать ваш словарь в массив пользовательских словарей, при этом каждый пользовательский словарь содержит ключи username и password

Ответ №2:

Посмотрите на использование python try и except . Они существуют, чтобы помочь нам обрабатывать ошибки, когда они возникают, при настройке способа обработки этих ошибок. Итак, для вашего конкретного вопроса попробуйте:

 def oldUser():
   username = input("Enter username: ")
   passw = input("Enter password: ")

# check if user exists and login matches password
   try:
     if passw == users[username]:
        print ("Login successful!n")
        print('Game begins')
   except:
      print ("nUser doesn't exist or wrong password!n")
  

Ответ №3:

Исправлено путем изменения

 def oldUser():
    username = input("Enter username: ")
    passw = input("Enter password: ")

    # check if user exists and login matches password
    if username not in users:
      print ("Username doesn't exist")
      print('Game begins')
    elif passw == users[username]:
        print('Log In successful')
    else:
        print ("nUser doesn't exist or wrong password!n")

while status != "q":            
    status = LogIn()