Python用户名验证脚本While循环无法正常退出问题求助
问题根源
你的问题出在**error_stack和printed_errors这两个列表没有在每次验证时重置**。
这两个变量定义在main()函数的外层作用域里,第一次验证失败时,错误会被添加到error_stack中;但后续再次调用username_input()时,这个列表并没有被清空——哪怕你输入了完全合规的用户名,error_stack里仍然保留着之前的错误记录,导致函数始终返回True,循环自然无法退出。
另外还有个小细节:STANDARD_CHARS里不小心包含了空格,这会让空格被当作合法字符,但你的需求是用户名仅包含数字和字母,这个空格也需要去掉。
修复方案
我们需要把error_stack和printed_errors移到username_input()函数内部,这样每次调用函数时,都会创建全新的空列表,不会保留之前的错误记录。同时修正STANDARD_CHARS的内容,顺便优化一些逻辑细节。
修改后的代码如下:
import os # 移除多余空格,只保留小写字母和数字 STANDARD_CHARS = list("abcdefghijklmnopqrstuvwxyz1234567890") ERROR_DICT = { "NonStandardCharacterError":"Your username should only have letters and numbers in it, please pick another.", "CurrentUserError":"Your username has already been taken, please pick another.", "LengthError":"Your username should be more than 2 characters in length, and fewer than 15 characters in length, please pick another.", } def main(): current_users = [] # 可添加示例已占用用户名,比如["test123"] def username_input(word_input): # 每次调用时初始化空的错误栈和已打印错误列表 error_stack = [] printed_errors = [] for char in word_input.lower(): if char not in STANDARD_CHARS: error_stack.append("NonStandardCharacterError") if word_input.lower() in current_users: error_stack.append("CurrentUserError") # 修正长度判断:符合3-14字符的要求 if len(word_input) > 14 or len(word_input) < 3: error_stack.append("LengthError") for error in error_stack: try: if error not in printed_errors: print(ERROR_DICT[error]) printed_errors.append(error) except KeyError: print("Your username has thrown an unknown error , please try again later or pick another username.") # 简化判断逻辑:直接返回错误栈是否非空 return len(error_stack) > 0 repeat = username_input(input("Please enter a username with only numbers and letters, which is above 2 characters and below 15 characters. If the username is taken you will be asked to pick a new one. \n|:")) while repeat: repeat = username_input(input("Please enter a username with only numbers and letters, which is above 2 characters and below 15 characters. If the username is taken you will be asked to pick a new one. \n|:")) if __name__ == "__main__": main()
额外优化说明
- 长度判断修正:原代码
len(word_input) > 15不符合“3到14字符”的要求,改成len(word_input) > 14后,最长允许14个字符,完全匹配需求。 - 逻辑简化:把
if error_stack != []: repeat=True else: repeat=False简化为return len(error_stack) > 0,代码更简洁易读。 - 测试便利:如果要验证“用户名已占用”的逻辑,可以在
current_users里添加示例用户名,比如current_users = ["alice", "bob123"]。
这样修改后,每次验证都会重新检查输入,之前的错误记录不会被保留,合规输入就能正常退出循环了。
内容的提问来源于stack exchange,提问作者good_variable_name
相关产品推荐
相关产品推荐

