summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-03-06 14:50:44 (GMT)
committerBerker Peksag <berker.peksag@gmail.com>2016-03-06 14:50:44 (GMT)
commitd07a1cb53b3d5b3b68b92207f308b6bfb9235a33 (patch)
tree942748d28e820de56f73df8e6c58d2934a0c7b63
parent48238c7e373aed6bf0f246b6c0887827397ae5ce (diff)
parentd66dd5ce68cbf4a33c385439d5eeb2bff4e860f1 (diff)
downloadcpython-d07a1cb53b3d5b3b68b92207f308b6bfb9235a33.zip
cpython-d07a1cb53b3d5b3b68b92207f308b6bfb9235a33.tar.gz
cpython-d07a1cb53b3d5b3b68b92207f308b6bfb9235a33.tar.bz2
Issue #26489: Add dictionary unpacking support to Tools/parser/unparse.py
Patch by Guo Ci Teo.
-rw-r--r--Lib/test/test_tools/test_unparse.py5
-rw-r--r--Misc/NEWS3
-rw-r--r--Tools/parser/unparse.py15
3 files changed, 20 insertions, 3 deletions
diff --git a/Lib/test/test_tools/test_unparse.py b/Lib/test/test_tools/test_unparse.py
index 4b47916..d91ade9 100644
--- a/Lib/test/test_tools/test_unparse.py
+++ b/Lib/test/test_tools/test_unparse.py
@@ -259,6 +259,11 @@ class UnparseTestCase(ASTTestCase):
def test_with_two_items(self):
self.check_roundtrip(with_two_items)
+ def test_dict_unpacking_in_dict(self):
+ # See issue 26489
+ self.check_roundtrip(r"""{**{'y': 2}, 'x': 1}""")
+ self.check_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""")
+
class DirectoryTestCase(ASTTestCase):
"""Test roundtrip behaviour on all files in Lib and Lib/test."""
diff --git a/Misc/NEWS b/Misc/NEWS
index f7d1234..9c94db3 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -828,6 +828,9 @@ Windows
Tools/Demos
-----------
+- Issue #26489: Add dictionary unpacking support to Tools/parser/unparse.py.
+ Patch by Guo Ci Teo.
+
- Issue #26316: Fix variable name typo in Argument Clinic.
- Issue #25440: Fix output of python-config --extension-suffix.
diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py
index 35ebc66..7203057 100644
--- a/Tools/parser/unparse.py
+++ b/Tools/parser/unparse.py
@@ -456,12 +456,21 @@ class Unparser:
def _Dict(self, t):
self.write("{")
- def write_pair(pair):
- (k, v) = pair
+ def write_key_value_pair(k, v):
self.dispatch(k)
self.write(": ")
self.dispatch(v)
- interleave(lambda: self.write(", "), write_pair, zip(t.keys, t.values))
+
+ def write_item(item):
+ k, v = item
+ if k is None:
+ # for dictionary unpacking operator in dicts {**{'y': 2}}
+ # see PEP 448 for details
+ self.write("**")
+ self.dispatch(v)
+ else:
+ write_key_value_pair(k, v)
+ interleave(lambda: self.write(", "), write_item, zip(t.keys, t.values))
self.write("}")
def _Tuple(self, t):