New submission from Peiran Yao <[email protected]>:
Currently, StopIteration raised accidentally inside the `function` being
applied is not caught by map(). This will cause the iteration of the map object
to terminate silently. (Whereas, when some other exception is raised, a
traceback is printed pinpointing the cause of the problem.)
Here's a minimal working example:
```
def take_first(it: Iterable):
# if `it` is empty, StopIteration will be raised accidentally
return next(it)
iterables = [iter([1]), iter([]), iter([2, 3])] # the second one is empty
for i in map(take_first, iterables):
print(i)
```
`take_first` function didn't consider the case where `it` is empty. The
programmer would expect an uncaught StopIteration, instead of the loop
terminating silently after only one iteration.
Similar to the case of generators (described in PEP 497), this behaviour can
conceal obscure bugs, and a solution could be catching StopIteration when
applying the function, and replacing it with a RuntimeError.
Beside the built-in map(), imap() and imap_unordered() in the concurrent and
multiprocessing modules also have similar behaviour.
PEP 479 -- Change StopIteration handling inside generators
https://www.python.org/dev/peps/pep-0479/
----------
messages: 412419
nosy: xavieryao
priority: normal
severity: normal
status: open
title: Should map(function, iterable, ...) replace StopIteration with
RuntimeError?
type: behavior
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue46621>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com