首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用装饰器获取意外错误

使用装饰器获取意外错误
EN

Stack Overflow用户
提问于 2018-04-14 18:11:19
回答 1查看 144关注 0票数 0

我想写一个代码,让人输入一个句子,然后再检查元音和检查,还应该返回句子中的元音总数。到目前为止,我的情况是这样的,但是,我没有运行一次输入,而是多次获得输入,然后代码产生了以下错误:TypeError: 'NoneType' object is not iterable

代码语言:javascript
复制
def vowel(func):
  def wrapper():
    vowels = "aeiouAEIOU"
    vowel_count = 0
    for items in func():
        if items in vowels:
            vowel_count += 1
            print("Vowel found: " + items)
    print("Total amount of vowels", vowel_count)
    return wrapper


def censorship(func):
    def wrapper():
        censorship_list = ["Word", "Word1", "Word2", "Word3"]
        for words in censorship_list:
            if words in func():
                print("You are not allowed to use those word(s) in set order: ", words)
    return wrapper


@vowel
@censorship
def sentence():
    sent = input("Input your sentence: ")
    return sent

sentence()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-14 18:20:00

有两个问题。首先,没有一个wrapper函数返回值。因此,当调用sentence时,censorship中的第一个wrapper将不会返回在vowel中使用的必要值。其次,func调用在vowel中将返回前一个装饰器返回的所有值(在censorship中);但是,即使censorship中的wrapper返回一个值,它也必须包含原始字符串输入的副本:

代码语言:javascript
复制
def vowel(func):
  def wrapper():
    vowels = "aeiouAEIOU"
    vowel_count = 0
    start_val = func()
    for items in start_val:
      if items in vowels:
        vowel_count += 1
    return start_val, vowel_count
  return wrapper

def censorship(func):
  def wrapper():
     censorship_list = ["Word", "Word1", "Word2", "Word3"]
     string = func()
     for words in censorship_list:
       if words in string:
         raise ValueError("You are not allowed to use those word(s) in set order: ")
     return string
  return wrapper

@vowel
@censorship
def sentence():
  sent = input("Input your sentence: ")
  return sent
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49834617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档