一个接一个地执行多个条件的python方法是什么,同时向用户显示哪一个是第一个失败的
假设我有这个工作代码:一个接一个地执行多个条件的python方法是什么,同时向用户显示哪一个是第一个失败的,python,python-3.x,conditional,refactoring,Python,Python 3.x,Conditional,Refactoring,假设我有这个工作代码: def check_some_conds(args): assert (condA(args) or condB(args)) assert condC(args) assert condD(args) return True (是的,我知道asserts是不好的,但请容忍我一会儿) 现在,当我调用这个函数时,我可以(或多或少地)通过使用除AssertionError:之外的并通过使用traceback模块执行
def check_some_conds(args):
assert (condA(args) or
condB(args))
assert condC(args)
assert condD(args)
return True
(是的,我知道assert
s是不好的,但请容忍我一会儿)
现在,当我调用这个函数时,我可以(或多或少地)通过使用除AssertionError:之外的并通过使用traceback模块执行一些魔术来重新获取第一个失败的断言
但是,这并不理想,因为:
assert
在python中得到了优化
- 我真的无法指定错误消息
- 玩回溯模块充其量也会让人感觉不舒服
- 我仍然需要得到一个布尔返回值,因此捕获该值然后更改返回值是样板代码
我正在寻找一种方法:
- 运行多个条件,其中大部分是独立的
- 知道某些函数可能很长,必须最后一次尝试(此处,
cond
可能需要几秒钟
- 其中一些可能是异步函数或只是内联求值(
a==b
)
- 返回布尔值(可选)
- 记录一条消息,说明
condD失败
或或condA或condB成功
如果这真的不可能,请随意建议我的问题的部分答案循环您的条件,并在最后提出错误:
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 ...
在您的条件下使用for进行迭代,如果是,则执行try/except以捕获异常?@roganjosh在优化模式下运行python时,\uuu debug\uuu
为False,断言语句将被忽略。为什么不使用pytest?@frenchmastswigh可以这样做,但这意味着必须编写大部分错误消息通过hand@RamazanPolat这实际上不是为了运行测试(如果只是…),但更多关于一个实时系统,它可以检查一些邮件中的垃圾邮件内容。例如,在我的代码中,condA可能指的是帐户的年龄。使用条件。\uu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu每个条件都会改变参数?我可能也会传递一组参数,但是你有更好的主意吗?在if not条件
中添加break
,以与assert
停止测试的方式保持一致(如果仍然需要此行为)这取决于参数如何变化。如果每个条件的参数都有很高的自定义级别,那么最好将所有参数传递到每个条件中,并处理在条件本身内部使用的参数。但是一个简单的bool断言,例如a==b
在赞扬,因为它直接计算为bool