使用装饰器时遇意外错误:TypeError及重复输入问题排查
解决你的代码问题:多次输入与TypeError报错
看起来你的代码里有两个核心问题:多次触发输入,以及TypeError: 'NoneType' object is not iterable的报错,我来帮你拆解并修复。
问题原因分析
TypeError报错的根源
你用了装饰器,但被装饰的函数func()没有返回要处理的字符串(默认返回None)。当你尝试for items in func()时,本质是在遍历None,这就会触发NoneType不可迭代的错误。多次输入的问题
大概率是你在装饰器内部和被装饰的函数里都调用了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
相关产品推荐
相关产品推荐

