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