From 71a278c086313ab6750889a269be9b7a819bd303 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Tue, 27 Dec 2022 12:06:48 -0800 Subject: [PATCH 1/2] Allow named expression in subscript: `a[b := c]` Signed-off-by: Anders Kaseorg --- Lib/test/test_named_expressions.py | 34 ++++++++++++++---------------- compiler/parser/python.lalrpop | 2 +- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_named_expressions.py b/Lib/test/test_named_expressions.py index b63f5d5945..797b0f512f 100644 --- a/Lib/test/test_named_expressions.py +++ b/Lib/test/test_named_expressions.py @@ -340,27 +340,25 @@ class NamedExpressionAssignmentTest(unittest.TestCase): fib = {(c := a): (a := b) + (b := a + c) - b for __ in range(6)} self.assertEqual(fib, {1: 2, 2: 3, 3: 5, 5: 8, 8: 13, 13: 21}) - # TODO: RUSTPYTHON, SyntaxError - # def test_named_expression_assignment_17(self): - # a = [1] - # element = a[b:=0] - # self.assertEqual(b, 0) - # self.assertEqual(element, a[0]) + def test_named_expression_assignment_17(self): + a = [1] + element = a[b:=0] + self.assertEqual(b, 0) + self.assertEqual(element, a[0]) - # TODO: RUSTPYTHON, SyntaxError - # def test_named_expression_assignment_18(self): - # class TwoDimensionalList: - # def __init__(self, two_dimensional_list): - # self.two_dimensional_list = two_dimensional_list + def test_named_expression_assignment_18(self): + class TwoDimensionalList: + def __init__(self, two_dimensional_list): + self.two_dimensional_list = two_dimensional_list - # def __getitem__(self, index): - # return self.two_dimensional_list[index[0]][index[1]] + def __getitem__(self, index): + return self.two_dimensional_list[index[0]][index[1]] - # a = TwoDimensionalList([[1], [2]]) - # element = a[b:=0, c:=0] - # self.assertEqual(b, 0) - # self.assertEqual(c, 0) - # self.assertEqual(element, a.two_dimensional_list[b][c]) + a = TwoDimensionalList([[1], [2]]) + element = a[b:=0, c:=0] + self.assertEqual(b, 0) + self.assertEqual(c, 0) + self.assertEqual(element, a.two_dimensional_list[b][c]) diff --git a/compiler/parser/python.lalrpop b/compiler/parser/python.lalrpop index a73d835203..4ec31c0cdc 100644 --- a/compiler/parser/python.lalrpop +++ b/compiler/parser/python.lalrpop @@ -1023,7 +1023,7 @@ SubscriptList: ast::Expr = { }; Subscript: ast::Expr = { - Test<"all">, + NamedExpressionTest, ?> ":" ?> => { let lower = e1.map(Box::new); let upper = e2.map(Box::new); From 6b12aeef6af1370cfbb16ee5d7483ab620f5b7f3 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Tue, 27 Dec 2022 12:13:50 -0800 Subject: [PATCH 2/2] Allow named expression in set comprehension: `{a := b for c in d}` Signed-off-by: Anders Kaseorg --- compiler/parser/python.lalrpop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/parser/python.lalrpop b/compiler/parser/python.lalrpop index 4ec31c0cdc..a49379c622 100644 --- a/compiler/parser/python.lalrpop +++ b/compiler/parser/python.lalrpop @@ -1185,7 +1185,7 @@ Atom: ast::Expr = { custom: (), node: ast::ExprKind::Set { elts } }, - "{" > "}" => { + "{" "}" => { ast::Expr { location, end_location: Some(end_location),