我想找到一种优雅的方法来获取下面的逻辑and
表达式的组件,如果if
块未执行 ,则该表达式负责。
if test1(value) and test2(value) and test3(value):
print 'Yeeaah'
else:
print 'Oh, no!', 'Who is the first function that return false?'
如果输入了else
块,如何通过返回第一个伪造的值来找出test1
,test2
或test3
是负责任的?
Salvo。
答案 0 :(得分:4)
我们可以将该测试值存储在列表中,然后检查它们是否全部为True,以及是否不打印第一个值为False的索引。
classpath 'com.android.tools.build:gradle:3.1.4'
输出:
def test1(x):
return True
def test2(x):
return False
def test3(x):
return True
value = 'a'
statements = [test1(value), test2(value), test3(value)]
if all(statements):
print('Yeeaah')
else:
print('Oh, no! Function that first return False is {}'.format(statements.index(False)))
答案 1 :(得分:1)
将其分为三部分:
使用python3语法:
b1 = test1(value)
b2 = test2(value)
b3 = test3(value)
if b1 and b2 and b3:
print("Yeah")
else:
print("Nope! 1: {}, 2: {}, 3: {}".format(b1, b2, b3))
答案 2 :(得分:1)
您可以使用next
和一个生成器表达式:
breaker = next((test.__name__ for test in (test1, test2, test3) if not test(value)), None)
演示:
>>> def test1(value): return True
>>> def test2(value): return False
>>> def test3(value): return True
>>> value = '_' # irrelevant for this demo
>>>
>>> tests = (test1, test2, test3)
>>> breaker = next((test.__name__ for test in tests if not test(value)), None)
>>> breaker
'test2'
>>> if not breaker:
...: print('Yeeaah')
...:else:
...: print('Oh no!')
...:
Oh no!
请注意,此代码中从未调用test3
。
(超级极端情况:如果出于某种原因我无法理解恶作剧者,请在if breaker is not None
上使用if not breaker
,将功能的__name__
属性重新分配给''
。)
〜编辑〜
如果您想知道第一个,第二个或第n个测试是否返回了 fassy ,可以将类似的生成器表达式与enumerate
一起使用。
>>> breaker = next((i for i, test in enumerate(tests, 1) if not test(value)), None)
>>> breaker
2
如果您想从零开始计数,请使用enumerate(tests)
并检查if breaker is not None
以输入if
块(因为0
是 fassy , None
。