https://github.com/python/cpython/commit/504ae606e192a88805996a7e934f38bc5cb7f28a
commit: 504ae606e192a88805996a7e934f38bc5cb7f28a
branch: main
author: Victorien <[email protected]>
committer: JelleZijlstra <[email protected]>
date: 2025-06-17T20:29:13-07:00
summary:
gh-119180: Only fetch globals and locals if necessary in
`annotationlib.get_annotations()` (#135644)
files:
A Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst
M Lib/annotationlib.py
diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py
index a7dfb91515a1c4..731817a9973799 100644
--- a/Lib/annotationlib.py
+++ b/Lib/annotationlib.py
@@ -939,48 +939,49 @@ def get_annotations(
if not eval_str:
return dict(ann)
- if isinstance(obj, type):
- # class
- obj_globals = None
- module_name = getattr(obj, "__module__", None)
- if module_name:
- module = sys.modules.get(module_name, None)
- if module:
- obj_globals = getattr(module, "__dict__", None)
- obj_locals = dict(vars(obj))
- unwrap = obj
- elif isinstance(obj, types.ModuleType):
- # module
- obj_globals = getattr(obj, "__dict__")
- obj_locals = None
- unwrap = None
- elif callable(obj):
- # this includes types.Function, types.BuiltinFunctionType,
- # types.BuiltinMethodType, functools.partial, functools.singledispatch,
- # "class funclike" from Lib/test/test_inspect... on and on it goes.
- obj_globals = getattr(obj, "__globals__", None)
- obj_locals = None
- unwrap = obj
- else:
- obj_globals = obj_locals = unwrap = None
-
- if unwrap is not None:
- while True:
- if hasattr(unwrap, "__wrapped__"):
- unwrap = unwrap.__wrapped__
- continue
- if functools := sys.modules.get("functools"):
- if isinstance(unwrap, functools.partial):
- unwrap = unwrap.func
+ if globals is None or locals is None:
+ if isinstance(obj, type):
+ # class
+ obj_globals = None
+ module_name = getattr(obj, "__module__", None)
+ if module_name:
+ module = sys.modules.get(module_name, None)
+ if module:
+ obj_globals = getattr(module, "__dict__", None)
+ obj_locals = dict(vars(obj))
+ unwrap = obj
+ elif isinstance(obj, types.ModuleType):
+ # module
+ obj_globals = getattr(obj, "__dict__")
+ obj_locals = None
+ unwrap = None
+ elif callable(obj):
+ # this includes types.Function, types.BuiltinFunctionType,
+ # types.BuiltinMethodType, functools.partial,
functools.singledispatch,
+ # "class funclike" from Lib/test/test_inspect... on and on it goes.
+ obj_globals = getattr(obj, "__globals__", None)
+ obj_locals = None
+ unwrap = obj
+ else:
+ obj_globals = obj_locals = unwrap = None
+
+ if unwrap is not None:
+ while True:
+ if hasattr(unwrap, "__wrapped__"):
+ unwrap = unwrap.__wrapped__
continue
- break
- if hasattr(unwrap, "__globals__"):
- obj_globals = unwrap.__globals__
-
- if globals is None:
- globals = obj_globals
- if locals is None:
- locals = obj_locals
+ if functools := sys.modules.get("functools"):
+ if isinstance(unwrap, functools.partial):
+ unwrap = unwrap.func
+ continue
+ break
+ if hasattr(unwrap, "__globals__"):
+ obj_globals = unwrap.__globals__
+
+ if globals is None:
+ globals = obj_globals
+ if locals is None:
+ locals = obj_locals
# "Inject" type parameters into the local namespace
# (unless they are shadowed by assignments *in* the local namespace),
diff --git
a/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst
b/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst
new file mode 100644
index 00000000000000..c5e5d5b4f8d85e
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-06-17-22-44-19.gh-issue-119180.Ogv8Nj.rst
@@ -0,0 +1,2 @@
+Only fetch globals and locals if necessary in
+:func:`annotationlib.get_annotations`
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]