You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
额外优化说明
  1. 长度判断修正:原代码len(word_input) > 15不符合“3到14字符”的要求,改成len(word_input) > 14后,最长允许14个字符,完全匹配需求。
  2. 逻辑简化:把if error_stack != []: repeat=True else: repeat=False简化为return len(error_stack) > 0,代码更简洁易读。
  3. 测试便利:如果要验证“用户名已占用”的逻辑,可以在current_users里添加示例用户名,比如current_users = ["alice", "bob123"]。

这样修改后,每次验证都会重新检查输入,之前的错误记录不会被保留,合规输入就能正常退出循环了。

内容的提问来源于stack exchange,提问作者good_variable_name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:21