From b1b39206dbe081d037d9aa8f70ec0510c96d6d14 Mon Sep 17 00:00:00 2001 From: Fergus Mitchell Date: Wed, 1 May 2024 10:57:26 +0100 Subject: [PATCH 1/4] Update the example implementation for islice * The previous version was needlessly complicated * It was also wrong since it overwrote stop == 0 to maxsize --- Doc/library/itertools.rst | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 9a5cb8be37d3496..c6c7add59d37d72 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -504,24 +504,14 @@ loops that truncate the stream. # islice('ABCDEFG', 2, None) → C D E F G # islice('ABCDEFG', 0, None, 2) → A C E G s = slice(*args) - start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1 - it = iter(range(start, stop, step)) - try: - nexti = next(it) - except StopIteration: - # Consume *iterable* up to the *start* position. - for i, element in zip(range(start), iterable): - pass - return - try: - for i, element in enumerate(iterable): - if i == nexti: - yield element - nexti = next(it) - except StopIteration: - # Consume to *stop*. - for i, element in zip(range(i + 1, stop), iterable): - pass + start = s.start if s.start is not None else 0 + stop = s.stop + step = s.step if s.step is not None else 1 + for i, element in enumerate(iterable): + if stop is not None and i >= stop: + return + if i >= start and (i - start) % step == 0: + yield element .. function:: pairwise(iterable) From a036e8562bc5f2e65d8ac7654704305ba50f0eb8 Mon Sep 17 00:00:00 2001 From: Fergus Mitchell Date: Wed, 1 May 2024 14:14:12 +0100 Subject: [PATCH 2/4] Change to pass tests in previous BPO See https://github.com/python/cpython/issues/71399#issuecomment-1093717115 --- Doc/library/itertools.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index c6c7add59d37d72..ec6e65122efe0a2 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -508,10 +508,10 @@ loops that truncate the stream. stop = s.stop step = s.step if s.step is not None else 1 for i, element in enumerate(iterable): - if stop is not None and i >= stop: - return if i >= start and (i - start) % step == 0: yield element + if stop is not None and i + 1 >= stop: + return .. function:: pairwise(iterable) From 3b06442895cc0c35c1c96151b915ce3b5205927e Mon Sep 17 00:00:00 2001 From: Fergus Mitchell Date: Wed, 1 May 2024 14:31:08 +0100 Subject: [PATCH 3/4] consume first --- Doc/library/itertools.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index ec6e65122efe0a2..970651b31867d1e 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -507,8 +507,14 @@ loops that truncate the stream. start = s.start if s.start is not None else 0 stop = s.stop step = s.step if s.step is not None else 1 - for i, element in enumerate(iterable): - if i >= start and (i - start) % step == 0: + it = iter(iterable) + for _ in zip(range(start), it): + # Consume up to *start* position + pass + if stop is not None and stop <= start: + return + for i, element in enumerate(iterable, start): + if (i - start) % step == 0: yield element if stop is not None and i + 1 >= stop: return From 1cf52175d1e7a50749f46d6dffdf146dec7a5428 Mon Sep 17 00:00:00 2001 From: Fergus Mitchell Date: Wed, 1 May 2024 15:34:55 +0100 Subject: [PATCH 4/4] fix typo --- Doc/library/itertools.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 970651b31867d1e..6205d27335ffe28 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -513,7 +513,7 @@ loops that truncate the stream. pass if stop is not None and stop <= start: return - for i, element in enumerate(iterable, start): + for i, element in enumerate(it, start): if (i - start) % step == 0: yield element if stop is not None and i + 1 >= stop: