]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35814: Allow same r.h.s. in annotated assignments as in normal ones (GH-11667)
authorIvan Levkivskyi <levkivskyi@gmail.com>
Fri, 25 Jan 2019 01:39:19 +0000 (01:39 +0000)
committerGitHub <noreply@github.com>
Fri, 25 Jan 2019 01:39:19 +0000 (01:39 +0000)
Grammar/Grammar
Lib/test/test_grammar.py
Lib/test/test_parser.py
Misc/NEWS.d/next/Core and Builtins/2019-01-24-13-25-21.bpo-35814.r_MjA6.rst [new file with mode: 0644]
Python/ast.c
Python/graminit.c

index f21fa1136432235eae094511e7ca3ac706a76140..8455c12592594bdca55d38c2bc21239ddc665152 100644 (file)
@@ -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: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
             '<<=' | '>>=' | '**=' | '//=')
index 3ed19ff1cb04c13ca7cc9491275e10963290e2a9..74590eb86f08eafae70894cbe19ae9c443de5093 100644 (file)
@@ -445,6 +445,15 @@ class GrammarTests(unittest.TestCase):
         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
index ac3899baedb629626d376cbf5cdda2366732bc73..19f178203642de234437012fbbc3730f3ae67fc5 100644 (file)
@@ -166,7 +166,7 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase):
         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 (file)
index 0000000..5d216b2
--- /dev/null
@@ -0,0 +1,2 @@
+Allow same right hand side expressions in annotated assignments as in normal ones.\r
+In particular, ``x: Tuple[int, int] = 1, 2`` (without parentheses on the right) is now allowed.
\ No newline at end of file
index 6560026109c8b28db7480b87e38978e1a2bdb2b1..e10e63f539c36f986cc1cbcca4c89f0fec4e58db 100644 (file)
@@ -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;
             }
index 91092f1e0b9ea2651818d2175e172896bd78d0a4..225d327939061648aa67d9cdc685d4f4768aa3f4 100644 (file)
@@ -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] = {