I was reading the source code of fixer_util.py and I noticed that one item enumerate was not like the others in consuming_calls because it does not actually consume the iterable in python 2 or python 3.
For example, fissix leaves this unchanged (without wrapping in list()) because it thinks that enumerate will consume the python 3 iterable: enumerate(d.items()). But it should wrap it in list because you might mutate d inside a loop: for i, x in enumerate(d.items()): del d[x] which will raise “RuntimeError: dictionary changed size during iteration” in python 3.
Instead, enumerate should be handled the same as iter.
Description
I was reading the source code of fixer_util.py and I noticed that one item
enumerate
was not like the others inconsuming_calls
because it does not actually consume the iterable in python 2 or python 3.For example, fissix leaves this unchanged (without wrapping in
list()
) because it thinks thatenumerate
will consume the python 3 iterable:enumerate(d.items())
. But it should wrap it inlist
because you might mutated
inside a loop:for i, x in enumerate(d.items()): del d[x]
which will raise “RuntimeError: dictionary changed size during iteration” in python 3.Instead,
enumerate
should be handled the same asiter
.Details