]> granicus.if.org Git - python/commitdiff
set items in dict displays from left to right (closes #24569)
authorBenjamin Peterson <benjamin@python.org>
Sun, 5 Jul 2015 15:37:25 +0000 (10:37 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sun, 5 Jul 2015 15:37:25 +0000 (10:37 -0500)
Lib/test/test_unpack_ex.py
Misc/NEWS
Python/ceval.c

index 01f57b95e75211c0c7e4208784a04cf138377117..d27eef039726d35c671ff50cbcadf939af31ef9a 100644 (file)
@@ -128,6 +128,9 @@ Dict display element unpacking
     ...                          for i in range(1000)) + "}"))
     1000
 
+    >>> {0:1, **{0:2}, 0:3, 0:4}
+    {0: 4}
+
 List comprehension element unpacking
 
     >>> a, b, c = [0, 1, 2], 3, 4
index b9cf2bcbf13d3fb3f8ca3be244937e320bdd1e08..46881c334fb8ee316af4af69d8590059a61fe35f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 3.5.0 beta 4?
 Core and Builtins
 -----------------
 
+- Issue #24569: Make PEP 448 dictionary evaluation more consistent.
+
 Library
 -------
 
index e68ae33bfd712f82074a3a34d4d49b9962df027e..ac52ad91e212d23889ec0b8ed395aef48fd97186 100644 (file)
@@ -2561,22 +2561,25 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
         }
 
         TARGET(BUILD_MAP) {
+            int i;
             PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg);
             if (map == NULL)
                 goto error;
-            while (--oparg >= 0) {
+            for (i = oparg; i > 0; i--) {
                 int err;
-                PyObject *value = TOP();
-                PyObject *key = SECOND();
-                STACKADJ(-2);
+                PyObject *key = PEEK(2*i);
+                PyObject *value = PEEK(2*i - 1);
                 err = PyDict_SetItem(map, key, value);
-                Py_DECREF(value);
-                Py_DECREF(key);
                 if (err != 0) {
                     Py_DECREF(map);
                     goto error;
                 }
             }
+
+            while (oparg--) {
+                Py_DECREF(POP());
+                Py_DECREF(POP());
+            }
             PUSH(map);
             DISPATCH();
         }