Message197726
Suppose we have the following code:
from heapq import merge
def iterable():
lst = range(10)
for i in xrange(20):
yield lst[i]
it1, it2= iterable(), iterable()
print list(merge(it1, it2)) # no IndexError
#output is: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9]
The reason is that in heapq.merge http://hg.python.org/cpython/file/7c18b799841e/Lib/heapq.py#l372 try-catch clause for IndexError is too broad
while 1:
try:
while 1:
v, itnum, next = s = h[0] # raises IndexError when h is empty
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
s[0] = next() also may raise different kinds of exceptions including IndexError which will be silently suppressed.
For example, this loop can be rewritten as
while 1:
try:
while 1:
try:
v, itnum, next = s = h[0] # raises IndexError when h is empty
except IndexError:
return
yield v
s[0] = next() # raises StopIteration when exhausted,
_heapreplace(h, s) # restore heap condition
except _StopIteration:
_heappop(h) # remove empty iterator |
|
Date |
User |
Action |
Args |
2013-09-14 19:16:38 | afn | set | recipients:
+ afn |
2013-09-14 19:16:38 | afn | set | messageid: <1379186198.08.0.186322749234.issue19018@psf.upfronthosting.co.za> |
2013-09-14 19:16:38 | afn | link | issue19018 messages |
2013-09-14 19:16:37 | afn | create | |
|