diff --git a/Lib/annotationlib.py b/Lib/annotationlib.py index a5788cdbfae3f5..4085cc6bef7954 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 8208d0e9c94819..a8537871d294cf 100644 --- a/Lib/test/test_annotationlib.py +++ b/Lib/test/test_annotationlib.py @@ -885,6 +885,9 @@ def test_stringized_annotations_with_star_unpack(self): 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 00000000000000..a9936b5d018692 --- /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.