Python 使用Yield并返回错误列表

Python 使用Yield并返回错误列表,python,generator,yield,Python,Generator,Yield,我有一段代码(一个xls解析器),它对字段进行一些验证,并返回一个包含xls的每一行的生成器 现在,我必须收集列表中的验证错误,并在生成器耗尽时使用它们 这是一段表示解析器的代码,也是一个设计糟糕的解决方案 error_list = [] def gen(limit): #xls parser for x in range(limit): if x%2: #fake error contition error_list.append(x)

我有一段代码(一个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

您可以使用异常:

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)

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

我会使用一个类来代替,因为一个实例提供了一些东西来保持这种额外的状态:

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

@埃里克:谢谢你的更正;我们的编辑冲突了,我手动合并了修复。有一个输入错误。它应该是
XLSParser
而不是
XMLParser
parser = XLSParser(limit)
for result in parser:
    # do something

errors = parser.error_list