为了满足特定的if语句,我有一个很长的条件列表可能是真的。 我试图调试并找出哪些条件已经满足,因为它不应该是,有没有比单独测试每个条件更好的方法?类似的东西:
if (xpr1 or xpr2 or xpr3 .......):
print "xpr# was true"
或更好。
print "all variables" from true condition
Python 2.7
答案 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上使用any
和all
,因为这样可以避免在达到短路点后对表达式进行不必要的评估,但是这样做了#39 ; s不适用于此。