]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39075: types.SimpleNamespace no longer sorts attributes in its repr (GH-19430)
authorZackery Spytz <zspytz@gmail.com>
Sat, 16 May 2020 01:27:54 +0000 (19:27 -0600)
committerGitHub <noreply@github.com>
Sat, 16 May 2020 01:27:54 +0000 (18:27 -0700)
Doc/library/types.rst
Lib/test/test_types.py
Misc/NEWS.d/next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst [new file with mode: 0644]
Objects/namespaceobject.c

index cdddb46783a47013b7412f5eeae78112bfb40171..79acdf4499afd2f09b0f51c47ab26e76674e4e0e 100644 (file)
@@ -355,8 +355,7 @@ Additional Utility Classes and Functions
                self.__dict__.update(kwargs)
 
            def __repr__(self):
-               keys = sorted(self.__dict__)
-               items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
+               items = (f"{k}={v!r}" for k, v in self.__dict__.items())
                return "{}({})".format(type(self).__name__, ", ".join(items))
 
            def __eq__(self, other):
@@ -368,6 +367,9 @@ Additional Utility Classes and Functions
 
    .. versionadded:: 3.3
 
+   .. versionchanged:: 3.9
+      Attribute order in the repr changed from alphabetical to insertion (like
+      ``dict``).
 
 .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)
 
index 28ebfb6e603e368c92383b24a31c0c9177de1605..49dc5bf40e3ed84d6ad35711c216f685aaa55b40 100644 (file)
@@ -1262,8 +1262,8 @@ class SimpleNamespaceTests(unittest.TestCase):
         ns2._y = 5
         name = "namespace"
 
-        self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name))
-        self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name))
+        self.assertEqual(repr(ns1), "{name}(x=1, y=2, w=3)".format(name=name))
+        self.assertEqual(repr(ns2), "{name}(x='spam', _y=5)".format(name=name))
 
     def test_equal(self):
         ns1 = types.SimpleNamespace(x=1)
@@ -1312,7 +1312,7 @@ class SimpleNamespaceTests(unittest.TestCase):
         ns3.spam = ns2
         name = "namespace"
         repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name)
-        repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name)
+        repr2 = "{name}(spam={name}(x=1, spam={name}(...)))".format(name=name)
 
         self.assertEqual(repr(ns1), repr1)
         self.assertEqual(repr(ns2), repr2)
diff --git a/Misc/NEWS.d/next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst b/Misc/NEWS.d/next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst
new file mode 100644 (file)
index 0000000..c447a19
--- /dev/null
@@ -0,0 +1,2 @@
+The repr for :class:`types.SimpleNamespace` is now insertion ordered rather
+than alphabetical.
index 29141a81d71ec5b0604d2bc735637ba4bcb5043c..fa37ed250d30a4b7f777748785aca8433c5c0d36 100644 (file)
@@ -91,8 +91,6 @@ namespace_repr(PyObject *ns)
     keys = PyDict_Keys(d);
     if (keys == NULL)
         goto error;
-    if (PyList_Sort(keys) != 0)
-        goto error;
 
     keys_iter = PyObject_GetIter(keys);
     if (keys_iter == NULL)