是在断言通过时评估的Python断言消息



假设我有一个assert语句,其中包含计算量很大的错误消息(例如,进行多次网络或数据库调用(。

assert x == 5, f"Some computationally heavy message here: {requests.get('xxx')}"

我也可以使用if语句编写此代码:

if x != 5:
raise AssertionError(f"Some computationally heavy message here: {requests.get('xxx')}")

我知道后一个选项只会在x != 5的情况下评估错误消息。前一种选择呢?我想是的,但我不确定。

否,如果断言条件为true,则不计算,之后的表达式:

>>> assert 1 == 5, foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

但是:

>>> assert 5 == 5, foo

不引发CCD_ 4。

根据语言参考,

扩展形式assert expression1, expression2等价于

if __debug__:
if not expression1: raise AssertionError(expression2)

和一个if语句

[…]通过计算表达式一来选择其中一个套件一个,直到发现一个是真的[…];然后执行该套件(没有执行或评估if语句的其他部分(

所以这似乎是必需的行为。

最新更新