From e8ac4271b159b7f47e15fb390da808d45037b61f Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 8 Jan 2026 05:07:23 +0100 Subject: [PATCH] [3.14] gh-143517: Fix an edge case in rewriting stringified starred annotations (GH-143518) (#143540) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit gh-143517: Fix an edge case in rewriting stringified starred annotations (GH-143518) (cherry picked from commit 6c9f7b4406d507625ff414cddc549d4c630c59c5) Co-authored-by: Bartosz Sławecki --- Lib/annotationlib.py | 2 +- Lib/test/test_annotationlib.py | 3 +++ .../Library/2026-01-07-15-49-06.gh-issue-143517.FP5KgL.rst | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2026-01-07-15-49-06.gh-issue-143517.FP5KgL.rst diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index a5788cdbfae3..4085cc6bef79 100644 --- a/Lib/annotationlib.py +++ b/Lib/annotationlib.py @@ -1096,7 +1096,7 @@ def _rewrite_star_unpack(arg): """If the given argument annotation expression is a star unpack e.g. `'*Ts'` rewrite it to a valid expression. """ - if arg.startswith("*"): + if arg.lstrip().startswith("*"): return f"({arg},)[0]" # E.g. (*Ts,)[0] or (*tuple[int, int],)[0] else: return arg diff --git a/Lib/test/test_annotationlib.py b/Lib/test/test_annotationlib.py index 8208d0e9c948..a8537871d294 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -885,6 +885,9 @@ class TestGetAnnotations(unittest.TestCase): def f(*args: "*tuple[int, ...]"): ... self.assertEqual(get_annotations(f, eval_str=True), {'args': (*tuple[int, ...],)[0]}) + def f(*args: " *tuple[int, ...]"): ... + self.assertEqual(get_annotations(f, eval_str=True), + {'args': (*tuple[int, ...],)[0]}) def test_stringized_annotations_on_wrapper(self): diff --git a/Misc/NEWS.d/next/Library/2026-01-07-15-49-06.gh-issue-143517.FP5KgL.rst b/Misc/NEWS.d/next/Library/2026-01-07-15-49-06.gh-issue-143517.FP5KgL.rst new file mode 100644 index 000000000000..a9936b5d0186 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-01-07-15-49-06.gh-issue-143517.FP5KgL.rst @@ -0,0 +1,4 @@ +:func:`annotationlib.get_annotations` no longer raises a :exc:`SyntaxError` +when evaluating a stringified starred annotation that starts with one +or more whitespace characters followed by a ``*``. +Patch by Bartosz Sławecki. -- 2.47.3