https://github.com/python/cpython/commit/a8ca26d250a3eedbb629fc19e40b7de6774f05a5
commit: a8ca26d250a3eedbb629fc19e40b7de6774f05a5
branch: main
author: Jelle Zijlstra <jelle.zijls...@gmail.com>
committer: JelleZijlstra <jelle.zijls...@gmail.com>
date: 2025-04-16T06:16:13-07:00
summary:

annotationlib: Remove some unnecessary dict copies (#132495)

files:
M Lib/annotationlib.py

diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py
index 322b6ded2b359a..2acd33b1e48dd8 100644
--- a/Lib/annotationlib.py
+++ b/Lib/annotationlib.py
@@ -716,11 +716,11 @@ def get_annotations(
             # For STRING, we try to call __annotate__
             ann = _get_and_call_annotate(obj, format)
             if ann is not None:
-                return ann
+                return dict(ann)
             # But if we didn't get it, we use __annotations__ instead.
             ann = _get_dunder_annotations(obj)
             if ann is not None:
-                 ann = annotations_to_string(ann)
+                 return annotations_to_string(ann)
         case Format.VALUE_WITH_FAKE_GLOBALS:
             raise ValueError("The VALUE_WITH_FAKE_GLOBALS format is for 
internal use only")
         case _:
@@ -813,7 +813,10 @@ def type_repr(value):
 
 
 def annotations_to_string(annotations):
-    """Convert an annotation dict containing values to approximately the 
STRING format."""
+    """Convert an annotation dict containing values to approximately the 
STRING format.
+
+    Always returns a fresh a dictionary.
+    """
     return {
         n: t if isinstance(t, str) else type_repr(t)
         for n, t in annotations.items()
@@ -821,27 +824,28 @@ def annotations_to_string(annotations):
 
 
 def _get_and_call_annotate(obj, format):
+    """Get the __annotate__ function and call it.
+
+    May not return a fresh dictionary.
+    """
     annotate = get_annotate_function(obj)
     if annotate is not None:
         ann = call_annotate_function(annotate, format, owner=obj)
         if not isinstance(ann, dict):
             raise ValueError(f"{obj!r}.__annotate__ returned a non-dict")
-        return dict(ann)
+        return ann
     return None
 
 
 def _get_dunder_annotations(obj):
-    if isinstance(obj, type):
-        try:
-            ann = obj.__annotations__
-        except AttributeError:
-            # For static types, the descriptor raises AttributeError.
-            return None
-    else:
-        ann = getattr(obj, "__annotations__", None)
-        if ann is None:
-            return None
+    """Return the annotations for an object, checking that it is a dictionary.
+
+    Does not return a fresh dictionary.
+    """
+    ann = getattr(obj, "__annotations__", None)
+    if ann is None:
+        return None
 
     if not isinstance(ann, dict):
         raise ValueError(f"{obj!r}.__annotations__ is neither a dict nor None")
-    return dict(ann)
+    return ann

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to