https://github.com/python/cpython/commit/dbee142a0175bb4717be2d96069bf21c01e532ce
commit: dbee142a0175bb4717be2d96069bf21c01e532ce
branch: main
author: Jelle Zijlstra <jelle.zijls...@gmail.com>
committer: JelleZijlstra <jelle.zijls...@gmail.com>
date: 2025-05-05T19:20:11-07:00
summary:

gh-132493: Avoid eager evaluation of annotations in `@reprlib.recursive_repr()` 
(#133411)

files:
A Misc/NEWS.d/next/Library/2025-05-04-16-37-28.gh-issue-132493.5yjZ75.rst
M Lib/reprlib.py
M Lib/test/test_reprlib.py

diff --git a/Lib/reprlib.py b/Lib/reprlib.py
index 19dbe3a07eb618..441d1be4bdede2 100644
--- a/Lib/reprlib.py
+++ b/Lib/reprlib.py
@@ -28,7 +28,7 @@ def wrapper(self):
         wrapper.__doc__ = getattr(user_function, '__doc__')
         wrapper.__name__ = getattr(user_function, '__name__')
         wrapper.__qualname__ = getattr(user_function, '__qualname__')
-        wrapper.__annotations__ = getattr(user_function, '__annotations__', {})
+        wrapper.__annotate__ = getattr(user_function, '__annotate__', None)
         wrapper.__type_params__ = getattr(user_function, '__type_params__', ())
         wrapper.__wrapped__ = user_function
         return wrapper
diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py
index ffeb1fba7b80c6..ffad35092f9916 100644
--- a/Lib/test/test_reprlib.py
+++ b/Lib/test/test_reprlib.py
@@ -3,6 +3,7 @@
   Nick Mathewson
 """
 
+import annotationlib
 import sys
 import os
 import shutil
@@ -11,7 +12,7 @@
 import unittest
 import textwrap
 
-from test.support import verbose
+from test.support import verbose, EqualToForwardRef
 from test.support.os_helper import create_empty_file
 from reprlib import repr as r # Don't shadow builtin repr
 from reprlib import Repr
@@ -829,5 +830,19 @@ def __repr__[T: str](self, default: T = '') -> str:
         self.assertEqual(type_params[0].__name__, 'T')
         self.assertEqual(type_params[0].__bound__, str)
 
+    def test_annotations(self):
+        class My:
+            @recursive_repr()
+            def __repr__(self, default: undefined = ...):
+                return default
+
+        annotations = annotationlib.get_annotations(
+            My.__repr__, format=annotationlib.Format.FORWARDREF
+        )
+        self.assertEqual(
+            annotations,
+            {'default': EqualToForwardRef("undefined", owner=My.__repr__)}
+        )
+
 if __name__ == "__main__":
     unittest.main()
diff --git 
a/Misc/NEWS.d/next/Library/2025-05-04-16-37-28.gh-issue-132493.5yjZ75.rst 
b/Misc/NEWS.d/next/Library/2025-05-04-16-37-28.gh-issue-132493.5yjZ75.rst
new file mode 100644
index 00000000000000..8d0b483aa22a9c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-05-04-16-37-28.gh-issue-132493.5yjZ75.rst
@@ -0,0 +1,2 @@
+Avoid eagerly evaluating annotations in functions decorated with
+:func:`reprlib.recursive_repr`.

_______________________________________________
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