@@ -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