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