Skip to content

Commit 2a0ffac

Browse files
committed
gh-144361: Add tests for forward reference default in type parameters
1 parent 201b532 commit 2a0ffac

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

Lib/test/test_typing.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,54 @@ def test_pickle(self):
823823
self.assertEqual(z.__bound__, typevar.__bound__)
824824
self.assertEqual(z.__default__, typevar.__default__)
825825

826+
def test_forward_reference_default_typevar(self):
827+
ns = run_code(
828+
"""
829+
class A[T, U = ForwardName]:
830+
pass
831+
"""
832+
)
833+
U, A = ns["A"].__type_params__[1], ns["A"]
834+
with self.assertRaises(NameError):
835+
U.__default__
836+
result = A[int]
837+
self.assertIsInstance(result.__args__[0], type)
838+
self.assertIs(int, result.__args__[0])
839+
self.assertIsInstance(result.__args__[1], ForwardRef)
840+
self.assertEqual(result.__args__[1].__forward_arg__, 'ForwardName')
841+
842+
def test_forward_reference_default_typevartuple(self):
843+
ns = run_code(
844+
"""
845+
class A[T, *Ts = ForwardName]:
846+
pass
847+
"""
848+
)
849+
Ts, A = ns["A"].__type_params__[1], ns["A"]
850+
with self.assertRaises(NameError):
851+
Ts.__default__
852+
result = A[int]
853+
self.assertIsInstance(result.__args__[0], type)
854+
self.assertIs(int, result.__args__[0])
855+
self.assertIsInstance(result.__args__[1], ForwardRef)
856+
self.assertEqual(result.__args__[1].__forward_arg__, 'ForwardName')
857+
858+
def test_forward_reference_default_paramspec(self):
859+
ns = run_code(
860+
"""
861+
class A[T, **P = ForwardName]:
862+
pass
863+
"""
864+
)
865+
P, A = ns["A"].__type_params__[1], ns["A"]
866+
with self.assertRaises(NameError):
867+
P.__default__
868+
result = A[int]
869+
self.assertIsInstance(result.__args__[0], type)
870+
self.assertIs(int, result.__args__[0])
871+
self.assertIsInstance(result.__args__[1], ForwardRef)
872+
self.assertEqual(result.__args__[1].__forward_arg__, 'ForwardName')
873+
826874

827875
def template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]:
828876
"""Renders templates with possible combinations of replacements.

0 commit comments

Comments
 (0)