From 6a66877304b467b49ad5ccaef32f08fbdc8fb552 Mon Sep 17 00:00:00 2001 From: Dmitrii Amelin Date: Sun, 22 Feb 2026 23:59:16 +0500 Subject: [PATCH] fix slices --- custom_components/pyscript/eval.py | 39 +++++------------------------- tests/test_unit_eval.py | 6 +++++ 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/custom_components/pyscript/eval.py b/custom_components/pyscript/eval.py index 5b27276..762be4b 100644 --- a/custom_components/pyscript/eval.py +++ b/custom_components/pyscript/eval.py @@ -1385,16 +1385,7 @@ async def recurse_assign(self, lhs, val): val_idx += 1 elif isinstance(lhs, ast.Subscript): var = await self.aeval(lhs.value) - if isinstance(lhs.slice, ast.Index): - ind = await self.aeval(lhs.slice.value) - var[ind] = val - elif isinstance(lhs.slice, ast.Slice): - lower = await self.aeval(lhs.slice.lower) if lhs.slice.lower else None - upper = await self.aeval(lhs.slice.upper) if lhs.slice.upper else None - step = await self.aeval(lhs.slice.step) if lhs.slice.step else None - var[slice(lower, upper, step)] = val - else: - var[await self.aeval(lhs.slice)] = val + var[await self.aeval(lhs.slice)] = val else: var_name = await self.aeval(lhs) if isinstance(var_name, EvalAttrSet): @@ -1455,21 +1446,7 @@ async def ast_delete(self, arg): for arg1 in arg.targets: if isinstance(arg1, ast.Subscript): var = await self.aeval(arg1.value) - if isinstance(arg1.slice, ast.Index): - ind = await self.aeval(arg1.slice.value) - for elt in ind if isinstance(ind, list) else [ind]: - del var[elt] - elif isinstance(arg1.slice, ast.Slice): - lower, upper, step = None, None, None - if arg1.slice.lower: - lower = await self.aeval(arg1.slice.lower) - if arg1.slice.upper: - upper = await self.aeval(arg1.slice.upper) - if arg1.slice.step: - step = await self.aeval(arg1.slice.step) - del var[slice(lower, upper, step)] - else: - del var[await self.aeval(arg1.slice)] + del var[await self.aeval(arg1.slice)] elif isinstance(arg1, ast.Name): if self.curr_func and arg1.id in self.curr_func.global_names: if arg1.id in self.global_sym_table: @@ -1857,13 +1834,6 @@ async def ast_subscript(self, arg): """Evaluate subscript.""" var = await self.aeval(arg.value) if isinstance(arg.ctx, ast.Load): - if isinstance(arg.slice, ast.Index): - return var[await self.aeval(arg.slice)] - if isinstance(arg.slice, ast.Slice): - lower = (await self.aeval(arg.slice.lower)) if arg.slice.lower else None - upper = (await self.aeval(arg.slice.upper)) if arg.slice.upper else None - step = (await self.aeval(arg.slice.step)) if arg.slice.step else None - return var[slice(lower, upper, step)] return var[await self.aeval(arg.slice)] return None @@ -1873,7 +1843,10 @@ async def ast_index(self, arg): async def ast_slice(self, arg): """Evaluate slice.""" - return await self.aeval(arg.value) + lower = (await self.aeval(arg.lower)) if arg.lower else None + upper = (await self.aeval(arg.upper)) if arg.upper else None + step = (await self.aeval(arg.step)) if arg.step else None + return slice(lower, upper, step) async def ast_call(self, arg): """Evaluate function call.""" diff --git a/tests/test_unit_eval.py b/tests/test_unit_eval.py index 5681fc8..7dad4de 100644 --- a/tests/test_unit_eval.py +++ b/tests/test_unit_eval.py @@ -113,6 +113,8 @@ ["[0, 1, 2, 3, 4, 5, 6, 7, 8][:4:]", [0, 1, 2, 3]], ["[0, 1, 2, 3, 4, 5, 6, 7, 8][::2]", [0, 2, 4, 6, 8]], ["[0, 1, 2, 3, 4, 5, 6, 7, 8][::]", [0, 1, 2, 3, 4, 5, 6, 7, 8]], + ["[0, 1, 2, 3, 4][4:1:-1]", [4, 3, 2]], + ["a = 1; b = 6; c = 2; [0, 1, 2, 3, 4, 5, 6][a:b:c]", [1, 3, 5]], ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[1:5:2] = [6, 8]; z", [0, 6, 2, 8, 4, 5, 6, 7, 8]], ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[1:5] = [10, 11]; z", [0, 10, 11, 5, 6, 7, 8]], ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[1::3] = [10, 11, 12]; z", [0, 10, 2, 3, 11, 5, 6, 12, 8]], @@ -121,6 +123,10 @@ ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[:6:2] = [10, 11, 12]; z", [10, 1, 11, 3, 12, 5, 6, 7, 8]], ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[:4:] = [10, 11, 12, 13]; z", [10, 11, 12, 13, 4, 5, 6, 7, 8]], ["z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[::2] = [10, 11, 12, 13, 14]; z", [10, 1, 11, 3, 12, 5, 13, 7, 14]], + ["x = [0, 1, 2, 3, 4]; x[1:4] = [9, 8]; x", [0, 9, 8, 4]], + ["x = [0, 1, 2, 3, 4, 5]; x[::2] = [9, 8, 7]; x", [9, 1, 8, 3, 7, 5]], + ["x = [0, 1, 2, 3, 4, 5]; del x[1:5:2]; x", [0, 2, 4, 5]], + ["x = [0, 1, 2, 3, 4]; del x[::-2]; x", [1, 3]], [ "z = [0, 1, 2, 3, 4, 5, 6, 7, 8]; z[::] = [10, 11, 12, 13, 14, 15, 16, 17]; z", [10, 11, 12, 13, 14, 15, 16, 17],