When tested for truthiness, a sequence or collection will evaluate to False
if it is empty (its __len__
method returns 0)
and to True
if it contains at least one element.
Using the assert
statement on a tuple literal will therefore always fail if the tuple is empty, and always succeed otherwise.
The assert
statement does not take parentheses around its parameters. Calling assert(x, y)
will test if the tuple
(x, y)
is True, which is always the case.
There are two possible fixes:
- If your intention is to test the first value of the tuple and use the second value as a message, simply remove the parentheses.
- If your intention is to check that every element of the tuple is
True
, test each value separately.
Code examples
Noncompliant code example
def test_values(a, b):
assert (a, b) # Noncompliant: will always be True
Compliant solution
def test_values(a, b):
# If you mean to test "a" and use "b" as an error message
assert a, b
# If you mean to test the values of "a" and "b"
assert a and b