amyreese / fissix

backport of lib2to3, with enhancements
Other
45 stars 22 forks source link

fix_dict does not wrap enumerate(d.items()) in a list #47

Open yonran opened 11 months ago

yonran commented 11 months ago

Description

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.

Details