Skip to content

Commit 15149f9

Browse files
Fix evaluating forward references in STRING format can 'leak' internal names in typing
1 parent 0f1f7c7 commit 15149f9

3 files changed

Lines changed: 22 additions & 3 deletions

File tree

Lib/test/test_typing.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7561,6 +7561,23 @@ def test_with_module(self):
75617561
typing.evaluate_forward_ref(
75627562
fwdref_module.fw,)
75637563

7564+
def test_evaluate_forward_ref_string_format(self):
7565+
# Test evaluating forward references in STRING format
7566+
# does not 'leak' internal names
7567+
# See https://github.com/python/cpython/issues/150641
7568+
from annotationlib import Format, get_annotations
7569+
7570+
def f(arg: unknown | str | int | list[str] | tuple[int, ...]): ...
7571+
7572+
ref = get_annotations(f, format=Format.FORWARDREF)['arg']
7573+
self.assertEqual(
7574+
typing.evaluate_forward_ref(ref, format=Format.STRING),
7575+
"unknown | str | int | list[str] | tuple[int, ...]",
7576+
)
7577+
self.assertEqual(
7578+
typing.evaluate_forward_ref(ref, format=Format.STRING),
7579+
ref.__resolved_str__
7580+
)
75647581

75657582
class CollectionsAbcTests(BaseTestCase):
75667583

Lib/typing.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,8 +1019,8 @@ def evaluate_forward_ref(
10191019
10201020
"""
10211021
if format == annotationlib.Format.STRING:
1022-
return forward_ref.__forward_arg__
1023-
if forward_ref.__forward_arg__ in _recursive_guard:
1022+
return forward_ref.__resolved_str__
1023+
if forward_ref.__resolved_str__ in _recursive_guard:
10241024
return forward_ref
10251025

10261026
if format is None:
@@ -1044,7 +1044,7 @@ def evaluate_forward_ref(
10441044
globals,
10451045
locals,
10461046
type_params,
1047-
recursive_guard=_recursive_guard | {forward_ref.__forward_arg__},
1047+
recursive_guard=_recursive_guard | {forward_ref.__resolved_str__},
10481048
format=format,
10491049
owner=owner,
10501050
parent_fwdref=forward_ref,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix evaluating forward references in STRING format can 'leak' internal names
2+
in ``typing``.

0 commit comments

Comments
 (0)