Skip to content

Commit be50575

Browse files
committed
pythongh-103054: Improve Callable type subtitution tests
1 parent 1fd603f commit be50575

1 file changed

Lines changed: 35 additions & 0 deletions

File tree

‎Lib/test/test_typing.py‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,6 +2049,41 @@ def test_concatenate(self):
20492049
Callable[Concatenate[int, str, P2], int])
20502050
self.assertEqual(C[...], Callable[Concatenate[int, ...], int])
20512051

2052+
def test_nested_paramspec(self):
2053+
# Since Callable has some special treatmeant, we want to be sure
2054+
# that substituion works correctly, see gh-103054
2055+
Callable = self.Callable
2056+
P = ParamSpec('P')
2057+
P2 = ParamSpec('P2')
2058+
T = TypeVar('T')
2059+
T2 = TypeVar('T2')
2060+
class My(Generic[P, T]):
2061+
pass
2062+
2063+
self.assertEqual(My.__parameters__, (P, T))
2064+
2065+
C1 = My[[int, T2], Callable[P2, T2]]
2066+
self.assertEqual(C1.__args__, ((int, T2), Callable[P2, T2]))
2067+
self.assertEqual(C1.__parameters__, (T2, P2))
2068+
self.assertEqual(C1[str, [list[int], bytes]],
2069+
My[[int, str], Callable[[list[int], bytes], str]])
2070+
2071+
C2 = My[[Callable[[T2], int], list[T2]], str]
2072+
self.assertEqual(C2.__args__, ((Callable[[T2], int], list[T2]), str))
2073+
self.assertEqual(C2.__parameters__, (T2,))
2074+
self.assertEqual(C2[list[str]],
2075+
My[[Callable[[list[str]], int], list[list[str]]], str])
2076+
2077+
C3 = My[[Callable[P2, T2], T2], T2]
2078+
self.assertEqual(C3.__args__, ((Callable[P2, T2], T2), T2))
2079+
self.assertEqual(C3.__parameters__, (P2, T2))
2080+
self.assertEqual(C3[[], int],
2081+
My[[Callable[[], int], int], int])
2082+
self.assertEqual(C3[[str, bool], int],
2083+
My[[Callable[[str, bool], int], int], int])
2084+
self.assertEqual(C3[[str, bool], T][int],
2085+
My[[Callable[[str, bool], int], int], int])
2086+
20522087
def test_errors(self):
20532088
Callable = self.Callable
20542089
alias = Callable[[int, str], float]

0 commit comments

Comments
 (0)