]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-85160: Reduce memory usage of `singledispatchmethod` (#107706)
authorAlex Waygood <Alex.Waygood@Gmail.com>
Mon, 7 Aug 2023 12:46:36 +0000 (13:46 +0100)
committerGitHub <noreply@github.com>
Mon, 7 Aug 2023 12:46:36 +0000 (13:46 +0100)
A small followup to #107148

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/functools.py

index 2a8a69b3c527aacea242c40d5369f22d3cbdcc2b..be44ccdae6b692b4d424be4c9647280b0d8a6b29 100644 (file)
@@ -928,14 +928,14 @@ class singledispatchmethod:
     """
 
     def __init__(self, func):
-        import weakref # see comment in singledispatch function
         if not callable(func) and not hasattr(func, "__get__"):
             raise TypeError(f"{func!r} is not callable or a descriptor")
 
         self.dispatcher = singledispatch(func)
         self.func = func
+
+        import weakref # see comment in singledispatch function
         self._method_cache = weakref.WeakKeyDictionary()
-        self._all_weakrefable_instances = True
 
     def register(self, cls, method=None):
         """generic_method.register(cls, func) -> func
@@ -945,11 +945,11 @@ class singledispatchmethod:
         return self.dispatcher.register(cls, func=method)
 
     def __get__(self, obj, cls=None):
-        if self._all_weakrefable_instances:
+        if self._method_cache is not None:
             try:
                 _method = self._method_cache[obj]
             except TypeError:
-                self._all_weakrefable_instances = False
+                self._method_cache = None
             except KeyError:
                 pass
             else:
@@ -963,7 +963,7 @@ class singledispatchmethod:
         _method.register = self.register
         update_wrapper(_method, self.func)
 
-        if self._all_weakrefable_instances:
+        if self._method_cache is not None:
             self._method_cache[obj] = _method
 
         return _method