Skip to content

gh-145300: Add __length_hint__ for itertools.islice#145333

Closed
KowalskiThomas wants to merge 4 commits intopython:mainfrom
KowalskiThomas:kowalski/gh-145300-add-__length_hint__-for-itertools-islice
Closed

gh-145300: Add __length_hint__ for itertools.islice#145333
KowalskiThomas wants to merge 4 commits intopython:mainfrom
KowalskiThomas:kowalski/gh-145300-add-__length_hint__-for-itertools-islice

Conversation

@KowalskiThomas
Copy link
Contributor

@KowalskiThomas KowalskiThomas commented Feb 27, 2026

Summary

This PR addresses an issue I spotted on #145300, which mentioned that itertools.islice does not support __length_hint__ currently.

General philosophy is

  • Early return 0 in all cases that make sense
  • If stop is not set, we don't know the number of elements we will iterate over, so we use the underlying iterator's __length_hint__ then do our calculations over that
  • Once we have a start, a stop and a step, or a start a length hint and a step, we can know how many iterations that will result in.

Testing wise, I added a few unit tests but it's unclear to me if I should be adding more (there doesn't seem to be a ton of instances/examples for the other itertools tests), but feel free to request more. Just to gain confidence in the change myself, I also tried the following locally (it works):

import itertools

for start in range(0, 100):
    for stop in range(0, 100):
        for step in range(1, 100):
            r = range(100)
            s = itertools.islice(r, start, stop, step)
            hint = s.__length_hint__()
            l = list(s)

            assert len(l) == hint

Note this is my first PR here; I read the contributor guidelines but I apologise in advance if anything I did not follow them (please do tell me!)

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants