bpo-34805: Guarantee that __subclasses__() is in definition order. (GH-23844)
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index e48f67b..2869378 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -5353,8 +5353,8 @@
.. method:: class.__subclasses__
Each class keeps a list of weak references to its immediate subclasses. This
- method returns a list of all those references still alive.
- Example::
+ method returns a list of all those references still alive. The list is in
+ definition order. Example::
>>> int.__subclasses__()
[<class 'bool'>]
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 307416c..f0048f4 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -4,6 +4,8 @@
import itertools
import math
import pickle
+import random
+import string
import sys
import types
import unittest
@@ -845,6 +847,14 @@ class Module(types.ModuleType, str):
self.fail("inheriting from ModuleType and str at the same time "
"should fail")
+ # Issue 34805: Verify that definition order is retained
+ def random_name():
+ return ''.join(random.choices(string.ascii_letters, k=10))
+ class A:
+ pass
+ subclasses = [type(random_name(), (A,), {}) for i in range(100)]
+ self.assertEqual(A.__subclasses__(), subclasses)
+
def test_multiple_inheritance(self):
# Testing multiple inheritance...
class C(object):