Python 使用Yield并返回错误列表
我有一段代码(一个xls解析器),它对字段进行一些验证,并返回一个包含xls的每一行的生成器 现在,我必须收集列表中的验证错误,并在生成器耗尽时使用它们 这是一段表示解析器的代码,也是一个设计糟糕的解决方案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)
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