【问题标题】:Using Yield and return a list of error使用 Yield 并返回错误列表
【发布时间】:2013-12-17 13:59:41
【问题描述】:

我有一段代码(一个 xls 解析器)对字段进行一些验证,并返回一个包含 xls 每一行的生成器。

现在,我必须在列表中收集验证错误,并在生成器耗尽时使用它们。

这段代码代表解析器和设计不佳的解决方案。

error_list = []

def gen(limit): #xls parser
    for x in range(limit):
        if x%2: #fake error contition
            error_list.append(x)
        else:
            yield(x*x) #return

有没有更蟒蛇的方式来做到这一点?我不是全局变量的忠实粉丝。

我希望尽可能保留代码,但如果没有其他方法,我会将函数转换为经典函数

def gen(limit): #xls parser
    error_list = []
    results = []
    for x in range(limit):
        if x%2: #fake error contition
            error_list.append(x)
        else:
            results.append(x*x)
    return results, error_list

【问题讨论】:

    标签: python generator yield


    【解决方案1】:

    生成器函数不能像这样返回带外数据。

    我会改用 class,因为一个实例可以让你坚持这种额外的状态:

    class XLSParser(object):
        def __init__(self, limit):
            self.error_list = []
            self.limit = limit
    
        def __iter__(self):
            for x in range(self.limit):
                if x%2: #fake error condition
                    self.error_list.append(x)
                else:
                    yield(x*x) #return
    

    并遍历该对象:

    parser = XLSParser(limit)
    for result in parser:
        # do something
    
    errors = parser.error_list
    

    【讨论】:

    • @Eric:感谢指正;我们的编辑发生冲突,我手动合并了修复。
    • 有一个错字。它应该是 XLSParser 而不是 XMLParser
    【解决方案2】:

    你可以使用异常:

    class XlsErrorList(Exception): pass
    
    def gen(limit):
        """xls parser"""
        error_list = []
        for x in range(limit):
            if x%2:  # fake error contition
                error_list.append(x)
            else:
                yield x*x
    
        if error_list:
            raise XlsErrorList(error_list)
    
    try:
        for x in gen(10):
            print x
    
    except XlsErrorList as e:
        print e.args
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2020-02-23
      • 2021-04-22
      相关资源
      最近更新 更多