调试python,确定哪个条件为真

时间:2016-12-22 08:02:22

标签: python python-2.7 debugging

为了满足特定的if语句,我有一个很长的条件列表可能是真的。 我试图调试并找出哪些条件已经满足,因为它不应该是,有没有比单独测试每个条件更好的方法?类似的东西:

if (xpr1 or xpr2 or xpr3 .......):
     print "xpr# was true"

或更好。

     print "all variables" from true condition 

Python 2.7

2 个答案:

答案 0 :(得分:2)

>>> a = False
>>> b = True
>>> c = False
>>> print [name for name in ['a', 'b', 'c'] if locals()[name]]
['b']

答案 1 :(得分:2)

没有比单独测试每个条件更好的方法,但你可以在列表理解中紧凑地做到这一点,例如:

conditions = (xpr0, xpr1, xpr2, xpr3)
print [i for i, xpr in enumerate(conditions) if xpr]

将打印一个真实的表达式索引列表。但是,这不会导致您使用or进行短路。

当然,您可以使用传统的"强制短路。 for循环,带有break语句,例如:

for i, xpr in enumerate(conditions):
    if xpr:
        print i, xpr
        break

虽然这与

执行的短路完全相同
if xpr0 or xpr1 or xpr2 or xpr3:

因为我们已经预先计算了conditions列表中的所有表达式。

正如hiro主角在评论中提到的,你可以测试这些表达中的任何一个是否属实

any(conditions)

并且 的短路方式与上面传统的for循环代码相同。

FWIW,通常,在生成器表达式而不是列表comp上使用anyall,因为这样可以避免在达到短路点后对表达式进行不必要的评估,但是这样做了#39 ; s不适用于此。