]> granicus.if.org Git - python/commitdiff
Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
authorNeal Norwitz <nnorwitz@gmail.com>
Wed, 12 Jul 2006 05:26:17 +0000 (05:26 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Wed, 12 Jul 2006 05:26:17 +0000 (05:26 +0000)
Lib/test/test_grammar.py
Misc/NEWS
Python/ast.c
Python/import.c

index 4bb4e45aaf0b46085384dd6ae0f19dbacd551316..f16086734371ad637c6e0b2a842565aa91c4e0c9 100644 (file)
@@ -531,6 +531,11 @@ n = 0
 for x in Squares(10): n = n+x
 if n != 285: raise TestFailed, 'for over growing sequence'
 
+result = []
+for x, in [(1,), (2,), (3,)]:
+    result.append(x)
+vereq(result, [1, 2, 3])
+
 print 'try_stmt'
 ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
 ###         | 'try' ':' suite 'finally' ':' suite
index 080f4a7f6f978818ea1cc4cc38b1326a3060e295..b3527654753be49a2be1b7ebc5faa5f96f679b26 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5 beta 2?
 Core and builtins
 -----------------
 
+- Bug #1520864: unpacking singleton tuples in for loop (for x, in) work again.
+
 - Bug #1441486: The literal representation of -(sys.maxint - 1)
   again evaluates to a int object, not a long.
 
index cd0649eb518918014fe77d60b49bcd34964f23c2..d00fcc8bdd0f681902502a4542dcb4c194faaabb 100644 (file)
@@ -2666,6 +2666,7 @@ ast_for_for_stmt(struct compiling *c, const node *n)
     asdl_seq *_target, *seq = NULL, *suite_seq;
     expr_ty expression;
     expr_ty target;
+    const node *node_target;
     /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
     REQ(n, for_stmt);
 
@@ -2675,10 +2676,13 @@ ast_for_for_stmt(struct compiling *c, const node *n)
             return NULL;
     }
 
-    _target = ast_for_exprlist(c, CHILD(n, 1), Store);
+    node_target = CHILD(n, 1);
+    _target = ast_for_exprlist(c, node_target, Store);
     if (!_target)
         return NULL;
-    if (asdl_seq_LEN(_target) == 1)
+    /* Check the # of children rather than the length of _target, since
+       for x, in ... has 1 element in _target, but still requires a Tuple. */
+    if (NCH(node_target) == 1)
        target = (expr_ty)asdl_seq_GET(_target, 0);
     else
        target = Tuple(_target, Store, LINENO(n), n->n_col_offset, c->c_arena);
index 933f094e7d8d29f1e9f7f78ca15186771f91348c..dfc25449dd1f8e2bff45ef1c6a6c79773dcfef12 100644 (file)
@@ -60,6 +60,7 @@ extern time_t PyOS_GetLastModificationTime(char *, FILE *);
        Python 2.5a0: 62081 (ast-branch)
        Python 2.5a0: 62091 (with)
        Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
+       Python 2.5c1: 62101 (fix wrong code: for x, in ...)
 .
 */
 #define MAGIC (62092 | ((long)'\r'<<16) | ((long)'\n'<<24))