什么是 pythonic 方式来执行多个条件,一个接一个,同时向用户显示哪个是第一个失败的
What is the pythonic way to execute multiple conditions, one after the other, while showing to the user which is the first to fail
假设我有这个工作代码:
def check_some_conds(args):
assert (condA(args) or
condB(args))
assert condC(args)
assert condD(args)
return True
(是的,我知道 assert
不好,但请稍等片刻)
现在,当我调用此函数时,我可以(或多或少)通过使用 except AssertionError:
并通过对回溯模块施展魔法来检索第一个失败的断言。
然而,这并不理想,因为:
assert
在 python 中被优化掉了
- 我真的无法指定错误消息
- 使用 traceback 模块充其量感觉很老套
- 我仍然需要得到一个布尔 return 值,所以捕获它然后更改 return 值是样板代码。
我正在寻找一种方法:
- 运行 多个条件,大多独立于另一个
- 知道有些功能可能比较长,必须最后尝试(这里,
condD
可能要秒
- 其中一些可能是异步函数或只是内联计算 (
a == b
)
- return 布尔值(可选)
- 记录一条消息,内容为
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 ...
假设我有这个工作代码:
def check_some_conds(args):
assert (condA(args) or
condB(args))
assert condC(args)
assert condD(args)
return True
(是的,我知道 assert
不好,但请稍等片刻)
现在,当我调用此函数时,我可以(或多或少)通过使用 except AssertionError:
并通过对回溯模块施展魔法来检索第一个失败的断言。
然而,这并不理想,因为:
assert
在 python 中被优化掉了
- 我真的无法指定错误消息
- 使用 traceback 模块充其量感觉很老套
- 我仍然需要得到一个布尔 return 值,所以捕获它然后更改 return 值是样板代码。
我正在寻找一种方法:
- 运行 多个条件,大多独立于另一个
- 知道有些功能可能比较长,必须最后尝试(这里,
condD
可能要秒 - 其中一些可能是异步函数或只是内联计算 (
a == b
)
- 知道有些功能可能比较长,必须最后尝试(这里,
- return 布尔值(可选)
- 记录一条消息,内容为
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 ...