Files
dgilland-pydash/PR.md
T
dualfroz 9194f6d3ad fix(arrays): return -1 from sorted_last_index_of on empty array
sorted_last_index returns 0 for an empty array (and for any value smaller
than every element), so index becomes -1. The guard only bounded index
from above, so array[-1] was evaluated on an empty list and raised
IndexError. Add the lower-bound check so a negative index is reported as
not found, matching sorted_index_of.
2026-09-04 09:17:47 +02:00

2.1 KiB

Fix sorted_last_index_of raising IndexError on empty array

Problem

pydash.sorted_last_index_of(array, value) raises IndexError when array is empty, instead of returning -1 (the documented "not found" result):

>>> import pydash
>>> pydash.sorted_last_index_of([], 10)
Traceback (most recent call last):
    ...
IndexError: list index out of range

The sibling function sorted_index_of returns -1 for the same input, so the two are inconsistent.

Root cause

src/pydash/arrays.py, in sorted_last_index_of:

index = sorted_last_index(array, value) - 1

if index < len(array) and array[index] == value:
    return index
else:
    return -1

sorted_last_index returns 0 for an empty array (and whenever value is smaller than every element), so index becomes -1. The guard only checks the upper bound (index < len(array)); since -1 < 0 is True for an empty array, array[index] is evaluated as array[-1] on an empty list, raising IndexError. For a non-empty array the same index == -1 accidentally avoids a wrong result only because array[-1] happens not to equal a value smaller than array[0]; the missing lower-bound check is still a latent correctness issue.

Fix

Add the lower-bound check so a negative computed index is treated as "not found":

if 0 <= index < len(array) and array[index] == value:
    return index
else:
    return -1

Test

Extended test_sorted_last_index_of in tests/test_arrays.py with the empty-array case and a value-below-range case:

([], 10, -1),
([2, 3, 4], 1, -1),

Gate

  • python -m pytest tests/test_arrays.py -k test_sorted_last_index_of -> 4 passed
  • python -m pytest tests/ --ignore=tests/pytest_mypy_testing -> 1917 passed

Counterfactual (fix reverted, test kept): the empty-array case fails with IndexError: list index out of range at arrays.py in sorted_last_index_of.

Flags for the account owner

The tests/pytest_mypy_testing/ suite fails locally with NameError (the reveal_type typing plugin is not resolvable in a bare pip install -e . environment). These failures are pre-existing and unrelated to this change.