如果断言通过,是否评估 Python 断言消息

Joh*_*etz 0 python assert assertion

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

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

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

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

我知道后一个选项只会评估错误消息,如果x != 5. 前一种选择呢?我会这么认为,但我不确定。

mkr*_*er1 5

不,,如果断言的条件为真,则不会评估之后的表达式:

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

但:

>>> assert 5 == 5, foo
Run Code Online (Sandbox Code Playgroud)

不提高NameError.

根据语言参考

扩展形式 ,assert expression1, expression2等价于

if __debug__:
    if not expression1: raise AssertionError(expression2)
Run Code Online (Sandbox Code Playgroud)

if声明

[…] 通过对表达式一一求值直到发现其中一个为真来精确地选择一个套件 […];然后执行该套件 (并且不执行或评估 if 语句的其他部分)

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