假设我有以下工作代码:
def check_some_conds(args):
assert (condA(args) or
condB(args))
assert condC(args)
assert condD(args)
return True
(是的,我知道assert
很糟糕,但请耐心等待)
现在,当我调用这个函数时,我可以(或多或少)通过使用except AssertionError:
和使用回溯模块来重试第一个失败的断言。
然而,这并不理想,因为:
assert
在python中进行了优化- 我真的无法指定错误消息
- 玩回溯模块充其量也只是感觉很粗糙
- 我仍然需要得到一个布尔返回值,所以捕捉它然后更改返回值是样板代码
我正在寻找一种方法:
- 运行多个条件,大多独立于其中一个
- 知道某些函数可能很长,必须最后尝试(此处,
condD
可能需要几秒钟 - 其中一些可能是异步函数,也可能只是内联求值(
a == b
)
- 知道某些函数可能很长,必须最后尝试(此处,
- 返回布尔值(可选)
- 记录写有
condD failed
或nor condA or condB succeded
的消息
如果这真的不可能,请随时为我的问题提供部分答案
遍历您的条件并在最后引发错误:
fail = False
for condition in [cond1, cond2, cond3 ...]:
if not condition(args):
print(condition.__name__, "failed")
fail = True
else:
print(condition.__name__, "succeeded")
if fail: raise ...