ts-node-action icon indicating copy to clipboard operation
ts-node-action copied to clipboard

[python] expand comprehensions into for loops via for_in_clause

Open alexpw opened this issue 2 years ago • 3 comments

This rewrites {set,list,dictionary}_ comprehensions into it's expanded for loop form. Unlike the if/else <-> ternary code, this can safely preserve all comments.

Notice: It does not support an action to toggle back to a comprehension as I haven't wrapped my head around how to approach that, except for in a very narrow case.

Warn: The most questionable thing is a decision made in order to support return statements, eg, return [x for x in range(10)]. The expanded form requires a variable to hold the list that is initialized, appended to, and returned, but there's no identifier name in this case. So, I either had to choose one, or prompt the user for one, ie with vim.fn.input(). I opted not to prompt and chose a generic/friendly name, result, instead of a generated collision-proof one like _list_accumulator_fda43. That means the comprehension's expanded form looks like:

result = []
for x in range(10):
    result.append(x)
return result

Tests include an "absurd" case to show that it supports many fors, ifs, comments, and multiline everything, everywhere, all at once.

alexpw avatar Feb 26 '23 01:02 alexpw