我试图弄清楚一个没有设置结果代码的功能的输出。我可以通过混合到stderr流中的“error:”字符串告诉它失败,通常是在不同的转换状态消息中。
我有以下列表理解可行,但扫描“error:”字符串两次。由于它只是重新扫描实际的错误行,它工作正常,但它让我烦恼我无法弄清楚如何使用单个扫描。这是工作代码:
errors = [e[e.find('error:'):] for e in err.splitlines() if 'error:' in e]
简化(和错误)的简化方法是保存“查找”结果
errors = [e[i:] for i in e.find('error:') if i != -1 for e in err.splitlines()]
但是,我得到“UnboundLocalError:在赋值之前引用的局部变量'e'”。盲目地扭转'理解中的'也失败了。这是怎么做到的?
感谢。肯特
答案 0 :(得分:3)
您可以将'error'
的检查放在生成器表达式中:
[e[i:] for i,e in
((e.find('error:'),e) for e in err.splitlines())
if i != -1]
你所做的是创建一个嵌套的理解,并且在第二个循环之前使用e
变量,你得到了UnboundLocalError
re.findall('error:(.*)', err)
也不需要拆分线。
完整错误(error:
部分)这有效:
re.findall('error:.*', err)
答案 1 :(得分:2)
使用具有正常循环的生成器来执行此类需要状态的任务:
def errsplit(err):
for e in err.splitlines():
errindex = e.find('error:')
if errindex > -1: yield e[errindex:]
如果您需要此列表,请执行list(errsplit(err))
。
列表推导并不是真正用于处理存储状态,并且尝试在其中使用存储状态可能会变得笨拙。
那就是说,正如@JBernardo所建议的那样,正则表达式可能会更好。
答案 2 :(得分:0)
我尝试过JBernardo的解决方案,但真正对我有用的是:
[errstr[i:] for i,errstr in
((e.find('error:'), e) for e in err.splitlines())
if i != -1]