Skip to content

Commit 6b6092f

Browse files
authored
bpo-39075: types.SimpleNamespace no longer sorts attributes in its repr (GH-19430)
1 parent 1ce5841 commit 6b6092f

File tree

4 files changed

+9
-7
lines changed

4 files changed

+9
-7
lines changed

Doc/library/types.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,7 @@ Additional Utility Classes and Functions
355355
self.__dict__.update(kwargs)
356356

357357
def __repr__(self):
358-
keys = sorted(self.__dict__)
359-
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
358+
items = (f"{k}={v!r}" for k, v in self.__dict__.items())
360359
return "{}({})".format(type(self).__name__, ", ".join(items))
361360

362361
def __eq__(self, other):
@@ -368,6 +367,9 @@ Additional Utility Classes and Functions
368367

369368
.. versionadded:: 3.3
370369

370+
.. versionchanged:: 3.9
371+
Attribute order in the repr changed from alphabetical to insertion (like
372+
``dict``).
371373

372374
.. function:: DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)
373375

Lib/test/test_types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,8 +1262,8 @@ def test_repr(self):
12621262
ns2._y = 5
12631263
name = "namespace"
12641264

1265-
self.assertEqual(repr(ns1), "{name}(w=3, x=1, y=2)".format(name=name))
1266-
self.assertEqual(repr(ns2), "{name}(_y=5, x='spam')".format(name=name))
1265+
self.assertEqual(repr(ns1), "{name}(x=1, y=2, w=3)".format(name=name))
1266+
self.assertEqual(repr(ns2), "{name}(x='spam', _y=5)".format(name=name))
12671267

12681268
def test_equal(self):
12691269
ns1 = types.SimpleNamespace(x=1)
@@ -1312,7 +1312,7 @@ def test_recursive_repr(self):
13121312
ns3.spam = ns2
13131313
name = "namespace"
13141314
repr1 = "{name}(c='cookie', spam={name}(...))".format(name=name)
1315-
repr2 = "{name}(spam={name}(spam={name}(...), x=1))".format(name=name)
1315+
repr2 = "{name}(spam={name}(x=1, spam={name}(...)))".format(name=name)
13161316

13171317
self.assertEqual(repr(ns1), repr1)
13181318
self.assertEqual(repr(ns2), repr2)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The repr for :class:`types.SimpleNamespace` is now insertion ordered rather
2+
than alphabetical.

Objects/namespaceobject.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,6 @@ namespace_repr(PyObject *ns)
9191
keys = PyDict_Keys(d);
9292
if (keys == NULL)
9393
goto error;
94-
if (PyList_Sort(keys) != 0)
95-
goto error;
9694

9795
keys_iter = PyObject_GetIter(keys);
9896
if (keys_iter == NULL)

0 commit comments

Comments
 (0)