字典搜索导致Python中的键错误

时间:2017-09-05 19:44:25

标签: python dictionary key

我查找了类似的stackoverflow问题,但没有一个是这样的。 很简单,我有以下代码,试图查找用户名和相应密码的字典。如果匹配,则授予访问权限并转到登录功能,否则访问被拒绝。

如下所示进行设置,当凭据正确无误时,它可以正常工作,但如果错误,则会导致密钥错误:

代码

username=input("Enter username:")
                     password=input("Enter password:")

                     accessgranted=False
                     while accessgranted==False:
                         if userinfo_dict[username]==password:
                             loggedin()
                             accessgranted==True
                         else:
                             break
                     print("Sorry, wrong credentials")
                     main()

错误

   if userinfo_dict[username]==password:
KeyError: 'ee'

该文件只是:

user1,pass1
user2,pass2

有人可以请 a)纠正并评论错误 b)建议实现相同目标的替代或更有效的方法

5 个答案:

答案 0 :(得分:2)

问题是,正如许多其他人已经指出的那样,您正在尝试获取不存在密钥的值。

一个简单的解决方法是仅在userinfo_dict[username] == password是现有密钥时检查是否username

username = input("Enter username:")
password = input("Enter password:")

access_granted = False
while access_granted is False:
    if username in userinfo_dict.keys() and userinfo_dict[username] == password:
        loggedin()
        access_granted = True
    else:
        break
print("Sorry, wrong credentials")
main()

编辑:access_granted标志无用,您可以这样做:

username = input("Enter username:")
password = input("Enter password:")

if username in userinfo_dict.keys() and userinfo_dict[username] == password:
    loggedin()
else:
    print("Sorry, wrong credentials")

答案 1 :(得分:0)

您可以检查用户名和密码是否都在字典中,并且它们是键值对,具有以下内容:

#Check that both username and password in dictionary
if username in userinfo_dict.keys() and password in userinfo_dict.values():
    if userinfo_dict[username] == password:
        accessgranted = True
else:
    print('Access Denied') #Print if either username or password not in dictionary

keys()方法返回字典中的键列表,而values()方法返回字典中值的列表。

答案 2 :(得分:0)

我同意上述情况。问题在于获取不存在的密钥。试试吧:

此外,代码需要进行一些重构,例如:

  • 通过'是'a;
  • 检查错误
  • accessgranted == True应该是赋值,而不是比较;
  • 循环的逻辑也必须改变。

见下文:

username = input("Enter username:")
password = input("Enter password:")

access_granted = False
while access_granted is False:
    if userinfo_dict.get(username) == password:
        # loggedin()
        access_granted = True
    else:
        print("Sorry, wrong credentials")
        break
# main()

答案 3 :(得分:0)

几乎总是使用dictionary.get(key)代替dictionary[key]。当密钥不存在时(例如在这种情况下),前者是安全的,而后者将抛出错误。

if userinfo_dict.get(username) == password: # returns None is key doesn't exist
    loggedin()
    accessGranted=True
else:
    break

答案 4 :(得分:0)

错误告诉你的是你已经输入了值" ee"对于用户名,但没有名为" ee" (也就是说,字典中没有键值" ee")的键值对。这是尝试获取不存在的键的值时的预期结果。

用于测试密钥存在的正确python习惯用语是:

if user_name in userinfo_dict: