@@ -628,10 +628,31 @@ def test_paramspec(self):
628
628
def test_concatenate (self ):
629
629
Callable = self .Callable
630
630
fullname = f"{ Callable .__module__ } .Callable"
631
+ T = TypeVar ('T' )
631
632
P = ParamSpec ('P' )
632
- C1 = Callable [typing .Concatenate [int , P ], int ]
633
- self .assertEqual (repr (C1 ),
634
- f"{ fullname } [typing.Concatenate[int, ~P], int]" )
633
+ P2 = ParamSpec ('P2' )
634
+ C = Callable [Concatenate [int , P ], T ]
635
+ self .assertEqual (repr (C ),
636
+ f"{ fullname } [typing.Concatenate[int, ~P], ~T]" )
637
+ self .assertEqual (C [P2 , int ], Callable [Concatenate [int , P2 ], int ])
638
+ self .assertEqual (C [[str , float ], int ], Callable [[int , str , float ], int ])
639
+ self .assertEqual (C [[], int ], Callable [[int ], int ])
640
+ self .assertEqual (C [Concatenate [str , P2 ], int ],
641
+ Callable [Concatenate [int , str , P2 ], int ])
642
+ with self .assertRaises (TypeError ):
643
+ C [..., int ]
644
+
645
+ C = Callable [Concatenate [int , P ], int ]
646
+ self .assertEqual (repr (C ),
647
+ f"{ fullname } [typing.Concatenate[int, ~P], int]" )
648
+ self .assertEqual (C [P2 ], Callable [Concatenate [int , P2 ], int ])
649
+ self .assertEqual (C [[str , float ]], Callable [[int , str , float ], int ])
650
+ self .assertEqual (C [str , float ], Callable [[int , str , float ], int ])
651
+ self .assertEqual (C [[]], Callable [[int ], int ])
652
+ self .assertEqual (C [Concatenate [str , P2 ]],
653
+ Callable [Concatenate [int , str , P2 ], int ])
654
+ with self .assertRaises (TypeError ):
655
+ C [...]
635
656
636
657
def test_errors (self ):
637
658
Callable = self .Callable
@@ -5004,6 +5025,27 @@ def test_valid_uses(self):
5004
5025
self .assertEqual (C4 .__args__ , (Concatenate [int , T , P ], T ))
5005
5026
self .assertEqual (C4 .__parameters__ , (T , P ))
5006
5027
5028
+ def test_var_substitution (self ):
5029
+ T = TypeVar ('T' )
5030
+ P = ParamSpec ('P' )
5031
+ P2 = ParamSpec ('P2' )
5032
+ C = Concatenate [T , P ]
5033
+ self .assertEqual (C [int , P2 ], Concatenate [int , P2 ])
5034
+ self .assertEqual (C [int , [str , float ]], (int , str , float ))
5035
+ self .assertEqual (C [int , []], (int ,))
5036
+ self .assertEqual (C [int , Concatenate [str , P2 ]],
5037
+ Concatenate [int , str , P2 ])
5038
+ with self .assertRaises (TypeError ):
5039
+ C [int , ...]
5040
+
5041
+ C = Concatenate [int , P ]
5042
+ self .assertEqual (C [P2 ], Concatenate [int , P2 ])
5043
+ self .assertEqual (C [[str , float ]], (int , str , float ))
5044
+ self .assertEqual (C [str , float ], (int , str , float ))
5045
+ self .assertEqual (C [[]], (int ,))
5046
+ self .assertEqual (C [Concatenate [str , P2 ]], Concatenate [int , str , P2 ])
5047
+ with self .assertRaises (TypeError ):
5048
+ C [...]
5007
5049
5008
5050
class TypeGuardTests (BaseTestCase ):
5009
5051
def test_basics (self ):
0 commit comments