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

使用装饰器时遇意外错误:TypeError及重复输入问题排查

解决你的代码问题:多次输入与TypeError报错

看起来你的代码里有两个核心问题:多次触发输入,以及TypeError: 'NoneType' object is not iterable的报错,我来帮你拆解并修复。

问题原因分析

  1. TypeError报错的根源
    你用了装饰器,但被装饰的函数func()没有返回要处理的字符串(默认返回None)。当你尝试for items in func()时,本质是在遍历None,这就会触发NoneType不可迭代的错误。

  2. 多次输入的问题
    大概率是你在装饰器内部和被装饰的函数里都调用了input(),或者装饰器的逻辑导致输入代码被重复执行了。

修正后的完整代码

我重构了代码,把输入、内容审查和元音统计的职责拆分清楚,解决了这两个问题:

def vowel_counter(func):
    def wrapper():
        # 调用被装饰函数,获取经过审查的用户输入(确保返回字符串)
        sentence = func()
        if not sentence:
            return
        
        # 元音统计逻辑
        vowels = "aeiouAEIOU"
        vowel_count = sum(1 for char in sentence if char in vowels)
        print(f"句子中的元音总数为:{vowel_count}")
        return vowel_count
    return wrapper

@vowel_counter
def get_checked_sentence():
    while True:
        user_input = input("请输入一个句子:")
        
        # 内容审查示例:过滤敏感词,可根据需求扩展
        sensitive_words = ["bad", "evil", "stupid"]
        has_sensitive_content = any(word in user_input.lower() for word in sensitive_words)
        
        if has_sensitive_content:
            print("⚠️ 输入包含敏感内容,请重新输入!")
            continue
        return user_input

# 执行函数
get_checked_sentence()

关键改进点

  • 修复TypeError:被装饰的get_checked_sentence()函数明确返回了用户输入的字符串(或在循环中一直要求重新输入),确保func()不会返回None,遍历操作就能正常执行。
  • 解决多次输入:把输入逻辑单独放在被装饰函数里,装饰器只负责统计元音,避免了重复触发输入的问题。
  • 优化元音统计:用生成器表达式配合sum()代替手动循环,代码更简洁高效。
  • 完善内容审查:加入循环,用户输入敏感内容时会被要求重新输入,而不是直接终止。

额外提示

如果你的内容审查需要更复杂的规则(比如正则匹配敏感词),可以把敏感词检查逻辑抽成单独的函数,让代码更易维护:

def has_sensitive_content(text):
    import re
    # 正则匹配敏感词(示例)
    sensitive_patterns = [r"bad", r"evil", r"stupid"]
    return any(re.search(pattern, text, re.IGNORECASE) for pattern in sensitive_patterns)

然后在get_checked_sentence()里调用这个函数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:48:28