Issue #26489: Add dictionary unpacking support to Tools/parser/unparse.py

Patch by Guo Ci Teo.
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 @@
     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 @@
 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 @@
 
     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):