From: Raymond Hettinger Date: Sat, 19 Dec 2020 00:53:50 +0000 (-0800) Subject: bpo-34805: Guarantee that __subclasses__() is in definition order. (GH-23844) X-Git-Tag: v3.10.0a4~126 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=51f4688254ebb7b30215de424360ba5c92c63fe8;p=thirdparty%2FPython%2Fcpython.git bpo-34805: Guarantee that __subclasses__() is in definition order. (GH-23844) --- diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index e48f67bfb963..2869378bbdaf 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -5353,8 +5353,8 @@ types, where they are relevant. Some of these are not reported by the .. 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__() [] diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 307416c3300a..f0048f42f882 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4,6 +4,8 @@ import gc import itertools import math import pickle +import random +import string import sys import types import unittest @@ -845,6 +847,14 @@ class ClassPropertiesAndMethods(unittest.TestCase): 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):