Search code examples
pythonassertassertion

Is the Python assert message evaluated if the assertion passes


Let's say I have an assert statement with a computationally heavy error message (e.g. makes several network or database calls).

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

I could also write this code using an if statement:

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

I know the latter option will only evaluate the error message if x != 5. What about the former option? I would assume so but I'm not sure.


Solution

  • No, the expression after the , is not evaluated if the asserted condition is true:

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

    But:

    >>> assert 5 == 5, foo
    

    does not raise a NameError.

    According to the language reference,

    The extended form, assert expression1, expression2, is equivalent to

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

    and an if statement

    […] selects exactly one of the suites by evaluating the expressions one by one until one is found to be true […]; then that suite is executed (and no other part of the if statement is executed or evaluated)

    So it seems this is the required behaviour.