如何改进Python认证代码:添加循环实现错误输入自动重新校验
现有代码存在的核心问题
- 逻辑判断存在运算符优先级漏洞:原代码中的
if UsernameCheck and UsernameCheck2 in Usernames实际执行逻辑为(bool(UsernameCheck)) and (UsernameCheck2 in Usernames),由于用户输入的用户名默认为非空字符串,这部分判断永远为真,完全没有对Player1输入的用户名做存在性校验,密码判断环节存在完全相同的问题。 - 凭据无绑定关系:用两个平行列表分别存储用户名、密码,无法实现账号与密码的一一对应,只要输入任意已注册的用户名、任意已设置的密码,就能通过校验,完全不满足身份认证的基本要求。
- 冗余代码:
str(input())为无效操作,input()方法本身返回值就是字符串类型,不需要额外强制转换;变量采用大驼峰命名,不符合Python语言的通用编码惯例。
优化改进方向
- 替换数据存储结构:用字典替代平行列表存储凭据,通过键值对实现用户名与密码的一一绑定,从结构上消除凭据错配的可能。
- 修正校验逻辑:明确规则为「输入的用户名存在于字典键中,且输入密码与该用户名绑定的密码完全匹配」,规避运算符优先级带来的逻辑错误。
- 模块化拆分校验逻辑:将单用户的校验流程封装为独立函数,减少重复代码,方便后续调整校验规则。
- 去掉无意义的类型转换代码,精简执行流程。
循环实现错误自动重试的完整代码实现
按照要求优先通过循环实现重试逻辑,当任意用户输入错误时,自动重置整个校验流程,引导用户重新输入:
# 预存合法用户凭据,结构为{注册用户名: 对应登录密码} user_credentials = { "Bob": "Password1", "Dave": "Password2" } def verify_player(player_num: int) -> bool: """完成单个玩家的凭据校验,校验通过返回True,失败返回False""" curr_username = input(f"Player {player_num} - Enter your username: ") curr_password = input(f"Player {player_num} - Enter your password: ") # 同时校验用户名存在、密码匹配对应值 if curr_username in user_credentials and user_credentials[curr_username] == curr_password: return True return False # 无限循环执行校验,直到全部通过才退出 while True: player1_pass = verify_player(1) player2_pass = verify_player(2) if player1_pass and player2_pass: print("Your credentials are valid") break print("Your credentials are invalid, try again\n")
代码逻辑说明:只要任意一个玩家的用户名或密码输入错误,就会提示错误信息并重新进入输入流程,不需要手动重启程序,完全覆盖错误重试的需求。
内容的提问来源于stack exchange,提问作者Nobody
相关产品推荐
相关产品推荐

