]> granicus.if.org Git - python/commitdiff
bpo-35814: Allow unpacking in r.h.s of annotated assignment expressions (GH-13760)
authorPablo Galindo <Pablogsal@gmail.com>
Mon, 3 Jun 2019 07:34:20 +0000 (08:34 +0100)
committerGitHub <noreply@github.com>
Mon, 3 Jun 2019 07:34:20 +0000 (08:34 +0100)
Grammar/Grammar
Lib/test/test_grammar.py
Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst [new file with mode: 0644]
Python/ast.c
Python/graminit.c

index 0cacfb648e9abb8f8411904354ac29a5fd925130..21f7e1a89115b29c96470dc5e84bbc341408501c 100644 (file)
@@ -84,7 +84,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))+ [TYPE_COMMENT]] )
-annassign: ':' test ['=' (yield_expr|testlist)]
+annassign: ':' test ['=' (yield_expr|testlist_star_expr)]
 testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
 augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
             '<<=' | '>>=' | '**=' | '//=')
index 2a3b71fac4a5a00336854213d11ea2e40bec3878..78d94593c7f3221170c0355024ef9f6b44fd5ca4 100644 (file)
@@ -454,6 +454,10 @@ class GrammarTests(unittest.TestCase):
         exec(stmt, ns)
         self.assertEqual(list(ns['f']()), [None])
 
+        ns = {"a": 1, 'b': (2, 3, 4), "c":5, "Tuple": typing.Tuple}
+        exec('x: Tuple[int, ...] = a,*b,c', ns)
+        self.assertEqual(ns['x'], (1, 2, 3, 4, 5))
+
     def test_funcdef(self):
         ### [decorators] 'def' NAME parameters ['->' test] ':' suite
         ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-03-00-51-02.bpo-35814.Cf7sGY.rst
new file mode 100644 (file)
index 0000000..2b9f00a
--- /dev/null
@@ -0,0 +1,2 @@
+Allow unpacking in the right hand side of annotated assignments. In
+particular, ``t: Tuple[int, ...] = x, y, *z`` is now allowed.
index b77552274d2443930d22fbe657ee6aae4d0d8244..df9242977e3f210a5f421b013fb95e3b568d4cd3 100644 (file)
@@ -3398,7 +3398,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
         }
         else {
             ch = CHILD(ann, 3);
-            if (TYPE(ch) == testlist) {
+            if (TYPE(ch) == testlist_star_expr) {
                 expr3 = ast_for_testlist(c, ch);
             }
             else {
index 0587b1c0fc105d5faafc8a1323665668f536a8aa..7c40ce933c1d61672b0f760f265e6d843219b909 100644 (file)
@@ -742,7 +742,7 @@ static const arc arcs_17_2[2] = {
     {0, 2},
 };
 static const arc arcs_17_3[2] = {
-    {47, 4},
+    {81, 4},
     {84, 4},
 };
 static const arc arcs_17_4[1] = {