使用Yield并返回错误列表

时间:2013-12-17 13:59:41

标签: 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)
        else:
            yield(x*x) #return

有更多的pythonic方法吗?我不是全球变量的忠实粉丝。

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

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

2 个答案:

答案 0 :(得分:5)

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

我会使用,因为一个实例会给你一些东西来坚持这样的额外状态:

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

答案 1 :(得分:3)

您可以使用例外:

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