bpo-35814: Allow same r.h.s. in annotated assignments as in normal ones (GH-11667)

https://github.com/python/cpython/commit/62c35a8a8ff5854ed470b1c16a7a14f3bb8... commit: 62c35a8a8ff5854ed470b1c16a7a14f3bb80368c branch: master author: Ivan Levkivskyi <levkivskyi@gmail.com> committer: GitHub <noreply@github.com> date: 2019-01-25T01:39:19Z summary: bpo-35814: Allow same r.h.s. in annotated assignments as in normal ones (GH-11667) files: A Misc/NEWS.d/next/Core and Builtins/2019-01-24-13-25-21.bpo-35814.r_MjA6.rst M Grammar/Grammar M Lib/test/test_grammar.py M Lib/test/test_parser.py M Python/ast.c M Python/graminit.c diff --git a/Grammar/Grammar b/Grammar/Grammar index f21fa1136432..8455c1259259 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -40,7 +40,7 @@ small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt) expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | ('=' (yield_expr|testlist_star_expr))*) -annassign: ':' test ['=' test] +annassign: ':' test ['=' (yield_expr|testlist)] testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=') diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index 3ed19ff1cb04..74590eb86f08 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -445,6 +445,15 @@ def __getitem__(self, item): exec('X: str', {}, CNS2()) self.assertEqual(nonloc_ns['__annotations__']['x'], str) + def test_var_annot_rhs(self): + ns = {} + exec('x: tuple = 1, 2', ns) + self.assertEqual(ns['x'], (1, 2)) + stmt = ('def f():\n' + ' x: int = yield') + exec(stmt, ns) + self.assertEqual(list(ns['f']()), [None]) + def test_funcdef(self): ### [decorators] 'def' NAME parameters ['->' test] ':' suite ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index ac3899baedb6..19f178203642 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -166,7 +166,7 @@ def test_var_annot(self): with self.assertRaises(SyntaxError): exec("x, *y, z: int = range(5)", {}, {}) with self.assertRaises(SyntaxError): - exec("t: tuple = 1, 2", {}, {}) + exec("x: int = 1, y = 2", {}, {}) with self.assertRaises(SyntaxError): exec("u = v: int", {}, {}) with self.assertRaises(SyntaxError): diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-24-13-25-21.bpo-35814.r_MjA6.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-24-13-25-21.bpo-35814.r_MjA6.rst new file mode 100644 index 000000000000..5d216b273e95 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-01-24-13-25-21.bpo-35814.r_MjA6.rst @@ -0,0 +1,2 @@ +Allow same right hand side expressions in annotated assignments as in normal ones. +In particular, ``x: Tuple[int, int] = 1, 2`` (without parentheses on the right) is now allowed. \ No newline at end of file diff --git a/Python/ast.c b/Python/ast.c index 6560026109c8..e10e63f539c3 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -3163,7 +3163,12 @@ ast_for_expr_stmt(struct compiling *c, const node *n) } else { ch = CHILD(ann, 3); - expr3 = ast_for_expr(c, ch); + if (TYPE(ch) == testlist) { + expr3 = ast_for_testlist(c, ch); + } + else { + expr3 = ast_for_expr(c, ch); + } if (!expr3) { return NULL; } diff --git a/Python/graminit.c b/Python/graminit.c index 91092f1e0b9e..225d32793906 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -498,8 +498,9 @@ static arc arcs_17_2[2] = { {31, 3}, {0, 2}, }; -static arc arcs_17_3[1] = { - {26, 4}, +static arc arcs_17_3[2] = { + {50, 4}, + {9, 4}, }; static arc arcs_17_4[1] = { {0, 4}, @@ -508,7 +509,7 @@ static state states_17[5] = { {1, arcs_17_0}, {1, arcs_17_1}, {2, arcs_17_2}, - {1, arcs_17_3}, + {2, arcs_17_3}, {1, arcs_17_4}, }; static arc arcs_18_0[2] = {
participants (1)
-
Ivan Levkivskyi