Skip to content

Commit e14996a

Browse files
fix: handle exhausted iterators
1 parent 82c68c8 commit e14996a

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

Lib/test/test_itertools.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,14 @@ def __index__(self):
12231223
self.assertEqual(islice(range(10), 3, None, 2).__length_hint__(), 4)
12241224
self.assertEqual(islice(range(10), 2, 2, 1).__length_hint__(), 0)
12251225

1226+
it = islice(iter(range(5)), None)
1227+
list(it) # exhaust
1228+
self.assertEqual(it.__length_hint__(), 0)
1229+
1230+
it = islice(iter(range(5)), 3)
1231+
list(it) # exhaust
1232+
self.assertEqual(it.__length_hint__(), 0)
1233+
12261234
def test_takewhile(self):
12271235
data = [1, 3, 5, 20, 2, 4, 6, 8]
12281236
self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])

Modules/itertoolsmodule.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1665,7 +1665,7 @@ islice_length_hint(PyObject *op, PyObject *Py_UNUSED(dummy))
16651665
{
16661666
isliceobject *lz = isliceobject_CAST(op);
16671667

1668-
if (lz->stop >= 0 && lz->stop <= lz->next) {
1668+
if (lz->it == NULL || (lz->stop >= 0 && lz->stop <= lz->next)) {
16691669
return PyLong_FromSsize_t(0);
16701670
}
16711671

0 commit comments

Comments
 (0)