我查找了类似的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)建议实现相同目标的替代或更有效的方法
答案 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)
我同意上述情况。问题在于获取不存在的密钥。试试吧:
此外,代码需要进行一些重构,例如:
见下文:
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: