From 129650c1b8a1f8bbc766262bcd01fc402212aba9 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 7 Apr 2020 23:44:21 -0600 Subject: [PATCH 1/2] bpo-39075: types.SimpleNamespace no longer sorts attributes in its repr --- Doc/library/types.rst | 5 +++-- Lib/test/test_types.py | 6 +++--- .../next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst | 1 + Objects/namespaceobject.c | 2 -- 4 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 4cb91c1a90bcfc..866bd03f603287 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -349,8 +349,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 = ("{}={!r}".format(k, v) for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): @@ -362,6 +361,8 @@ Additional Utility Classes and Functions .. versionadded:: 3.3 + .. versionchanged:: 3.9 + Attributes are no longer sorted in the repr. .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index f42238762ddcca..77928ef8e18df5 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -1253,8 +1253,8 @@ def test_repr(self): 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) @@ -1303,7 +1303,7 @@ def test_recursive_repr(self): 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 index 00000000000000..d9040b1b2fb24b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst @@ -0,0 +1 @@ +:class:`types.SimpleNamespace` no longer sorts the attributes in its repr. diff --git a/Objects/namespaceobject.c b/Objects/namespaceobject.c index a28b9e509fcfb0..8389bc0e2114dd 100644 --- a/Objects/namespaceobject.c +++ b/Objects/namespaceobject.c @@ -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) From c11058b44ecfc9d6d039227cfd32a4e3ff62a199 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Tue, 12 May 2020 10:17:52 -0600 Subject: [PATCH 2/2] Address comments. --- Doc/library/types.rst | 5 +++-- .../next/Library/2020-04-07-23-44-06.bpo-39075.hgck3j.rst | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/library/types.rst b/Doc/library/types.rst index c45c9cc9062902..79acdf4499afd2 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -355,7 +355,7 @@ Additional Utility Classes and Functions self.__dict__.update(kwargs) def __repr__(self): - items = ("{}={!r}".format(k, v) for k, v in self.__dict__.items()) + items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): @@ -368,7 +368,8 @@ Additional Utility Classes and Functions .. versionadded:: 3.3 .. versionchanged:: 3.9 - Attributes are no longer sorted in the repr. + Attribute order in the repr changed from alphabetical to insertion (like + ``dict``). .. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None) 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 index d9040b1b2fb24b..c447a191f07f3b 100644 --- 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 @@ -1 +1,2 @@ -:class:`types.SimpleNamespace` no longer sorts the attributes in its repr. +The repr for :class:`types.SimpleNamespace` is now insertion ordered rather +than alphabetical.