Skip to content

Commit bac66a5

Browse files
committed
added dict comprehension
1 parent ab2a19c commit bac66a5

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

custom_components/pyscript/eval.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,11 +1016,32 @@ async def ast_dict(self, arg):
10161016
val[await self.aeval(key_ast)] = this_val
10171017
return val
10181018

1019+
async def dictcomp_loop(self, generators, key, value):
1020+
"""Recursive dict comprehension."""
1021+
out = {}
1022+
gen = generators[0]
1023+
for loop_var in await self.aeval(gen.iter):
1024+
await self.recurse_assign(gen.target, loop_var)
1025+
for cond in gen.ifs:
1026+
if not await self.aeval(cond):
1027+
break
1028+
else:
1029+
if len(generators) == 1:
1030+
out[await self.aeval(key)] = await self.aeval(value)
1031+
else:
1032+
out.update(await self.dictcomp_loop(generators[1:], key, value))
1033+
return out
1034+
1035+
async def ast_dictcomp(self, arg):
1036+
"""Evaluate dict comprehension."""
1037+
return await self.dictcomp_loop(arg.generators, arg.key, arg.value)
1038+
10191039
async def ast_set(self, arg):
10201040
"""Evaluate set."""
1021-
return {
1022-
elt for elt in await self.eval_elt_list(arg.elts)
1023-
} # pylint: disable=unnecessary-comprehension
1041+
ret = set()
1042+
for elt in await self.eval_elt_list(arg.elts):
1043+
ret.add(elt)
1044+
return ret
10241045

10251046
async def setcomp_loop(self, generators, elt):
10261047
"""Recursive list comprehension."""

tests/custom_components/pyscript/test_unit_eval.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,29 @@ def no_op(i):
232232
""",
233233
[{0, 1, 2, 4, 6}, 13],
234234
],
235+
["{str(i):i for i in range(5) if i != 3}", {"0": 0, "1": 1, "2": 2, "4": 4}],
236+
[
237+
"{v:k for k,v in {str(i):i for i in range(5)}.items()}",
238+
{0: "0", 1: "1", 2: "2", 3: "3", 4: "4"},
239+
],
240+
[
241+
"{f'{i}+{k}':i+k for i in range(3) for k in range(3)}",
242+
{
243+
"0+0": 0,
244+
"0+1": 1,
245+
"0+2": 2,
246+
"1+0": 1,
247+
"1+1": 2,
248+
"1+2": 3,
249+
"2+0": 2,
250+
"2+1": 3,
251+
"2+2": 4,
252+
},
253+
],
254+
[
255+
"{f'{i}+{k}':i+k for i in range(3) for k in range(3) if k <= i}",
256+
{"0+0": 0, "1+0": 1, "1+1": 2, "2+0": 2, "2+1": 3, "2+2": 4},
257+
],
235258
[
236259
"""
237260
d = {"x": 1, "y": 2, "z": 3}

0 commit comments

Comments
 (0)