Skip to content

Commit d6cb69a

Browse files
committed
gh-92810: Add What's New entry
1 parent 4ed489d commit d6cb69a

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

Doc/whatsnew/3.15.rst

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,29 @@ arguments (:pep:`791`).
413413
Improved modules
414414
================
415415

416+
abc
417+
---
418+
419+
* Reduce memory usage of :func:`issubclass` checks for :class:`abc.ABCMeta` subclasses.
420+
421+
Unlike regular classes, there subclass checks can lead to upstream calls like this:
422+
423+
``issubclass(Some, Child)`` -> ``issubclass(Some, Parent)`` -> ``issubclass(Some, Top)``
424+
(stops here)
425+
426+
:class:`abc.ABCMeta` subclasses may also trigger downstream checks:
427+
428+
``issubclass(Some, Child)`` -> ``issubclass(Some, Parent)`` -> ``issubclass(Some, Top)``
429+
(nothing found) -> ``issubclass(Some, Child.__subclasses__)`` -> ``issubclass(Some, ...)``
430+
431+
This could lead to memory bloat in large ABC class tree (thousands of subclasses).
432+
433+
Most of classes don't override ``__subclasses`` method, so this check is redundant.
434+
Now :meth:`!abc.ABCMeta.__new__` checks if method is present, and if not, skips
435+
recursive downstream checks in :func:`issubclass`.
436+
437+
(Contributed by Maxim Martynov in :gh:`92810`.)
438+
416439
argparse
417440
--------
418441

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Reduce memory usage by :meth:`~type.__subclasscheck__` for
2+
:class:`abc.ABCMeta` with large class trees.

0 commit comments

Comments
 (0)