mirror of https://github.com/python/cpython
Issue #19018: The heapq.merge() function no longer suppresses IndexError
This commit is contained in:
parent
0a32d92bff
commit
46f5ca31d0
14
Lib/heapq.py
14
Lib/heapq.py
|
@ -358,6 +358,7 @@ def merge(*iterables):
|
|||
|
||||
'''
|
||||
_heappop, _heapreplace, _StopIteration = heappop, heapreplace, StopIteration
|
||||
_len = len
|
||||
|
||||
h = []
|
||||
h_append = h.append
|
||||
|
@ -369,17 +370,20 @@ def merge(*iterables):
|
|||
pass
|
||||
heapify(h)
|
||||
|
||||
while 1:
|
||||
while _len(h) > 1:
|
||||
try:
|
||||
while 1:
|
||||
v, itnum, next = s = h[0] # raises IndexError when h is empty
|
||||
while True:
|
||||
v, itnum, next = s = h[0]
|
||||
yield v
|
||||
s[0] = next() # raises StopIteration when exhausted
|
||||
_heapreplace(h, s) # restore heap condition
|
||||
except _StopIteration:
|
||||
_heappop(h) # remove empty iterator
|
||||
except IndexError:
|
||||
return
|
||||
if h:
|
||||
# fast case when only a single iterator remains
|
||||
v, itnum, next = h[0]
|
||||
yield v
|
||||
yield from next.__self__
|
||||
|
||||
# Extend the implementations of nsmallest and nlargest to use a key= argument
|
||||
_nsmallest = nsmallest
|
||||
|
|
|
@ -158,6 +158,15 @@ class TestHeap:
|
|||
self.assertEqual(sorted(chain(*inputs)), list(self.module.merge(*inputs)))
|
||||
self.assertEqual(list(self.module.merge()), [])
|
||||
|
||||
def test_merge_does_not_suppress_index_error(self):
|
||||
# Issue 19018: Heapq.merge suppresses IndexError from user generator
|
||||
def iterable():
|
||||
s = list(range(10))
|
||||
for i in range(20):
|
||||
yield s[i] # IndexError when i > 10
|
||||
with self.assertRaises(IndexError):
|
||||
list(self.module.merge(iterable(), iterable()))
|
||||
|
||||
def test_merge_stability(self):
|
||||
class Int(int):
|
||||
pass
|
||||
|
|
|
@ -133,6 +133,7 @@ Paul Boddie
|
|||
Matthew Boedicker
|
||||
Robin Boerdijk
|
||||
David Bolen
|
||||
Wouter Bolsterlee
|
||||
Gawain Bolton
|
||||
Forest Bond
|
||||
Gregory Bond
|
||||
|
@ -382,6 +383,7 @@ Nils Fischbeck
|
|||
Frederik Fix
|
||||
Matt Fleming
|
||||
Hernán Martínez Foffani
|
||||
Artem Fokin
|
||||
Arnaud Fontaine
|
||||
Michael Foord
|
||||
Amaury Forgeot d'Arc
|
||||
|
|
|
@ -72,6 +72,9 @@ Library
|
|||
- Issue #17324: Fix http.server's request handling case on trailing '/'. Patch
|
||||
contributed by Vajrasky Kok.
|
||||
|
||||
- Issue #19018: The heapq.merge() function no longer suppresses IndexError
|
||||
in the underlying iterables.
|
||||
|
||||
- Issue #18784: The uuid module no more attempts to load libc via ctypes.CDLL,
|
||||
if all necessary functions are already found in libuuid.
|
||||
Patch by Evgeny Sologubov.
|
||||
|
|
Loading…
Reference in New Issue