2

我试图了解一个没有设置结果代码的功能的输出。我可以通过混合到标准错误流中的“错误:”字符串来判断它失败,通常在不同的转换状态消息中间。

我有以下列表理解,它有效,但扫描“错误:”字符串两次。由于它只是重新扫描实际的错误行,它工作正常,但它让我很恼火,我无法弄清楚如何使用单次扫描。这是工作代码:

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'”。盲目地颠倒理解中的“for”也失败了。这是怎么做到的?

谢谢。肯特

4

3 回答 3

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)
于 2012-06-26T15:05:31.760 回答
2

使用带有正常循环的生成器来执行这种需要状态的任务:

def errsplit(err):
    for e in err.splitlines():
        errindex = e.find('error:')
        if errindex > -1: yield e[errindex:]

如果您需要将此作为列表,只需执行list(errsplit(err)).

列表推导并不是真正打算处理存储状态,尝试在其中使用存储状态可能会变得笨拙。

也就是说,请注意,正如@JBernardo 所建议的那样,正则表达式可能会更好。

于 2012-06-26T15:08:51.773 回答
0

我已经尝试过 JBernardo 的解决方案,但真正对我有用的是:

[errstr[i:] for i,errstr in
 ((e.find('error:'), e) for e in err.splitlines())
 if i != -1]
于 2012-06-26T15:21:58.603 回答