@@ -7679,6 +7679,127 @@ def test_bad_var_substitution(self):
7679
7679
with self .assertRaises (TypeError ):
7680
7680
collections .abc .Callable [P , T ][arg , str ]
7681
7681
7682
+ def test_type_var_subst_for_other_type_vars (self ):
7683
+ T = TypeVar ('T' )
7684
+ T2 = TypeVar ('T2' )
7685
+ P = ParamSpec ('P' )
7686
+ P2 = ParamSpec ('P2' )
7687
+ Ts = TypeVarTuple ('Ts' )
7688
+
7689
+ class Base (Generic [P ]):
7690
+ pass
7691
+
7692
+ A1 = Base [T ]
7693
+ self .assertEqual (A1 .__parameters__ , (T ,))
7694
+ self .assertEqual (A1 .__args__ , ((T ,),))
7695
+ self .assertEqual (A1 [int ], Base [int ])
7696
+
7697
+ A2 = Base [[T ]]
7698
+ self .assertEqual (A2 .__parameters__ , (T ,))
7699
+ self .assertEqual (A2 .__args__ , ((T ,),))
7700
+ self .assertEqual (A2 [int ], Base [int ])
7701
+
7702
+ A3 = Base [[int , T ]]
7703
+ self .assertEqual (A3 .__parameters__ , (T ,))
7704
+ self .assertEqual (A3 .__args__ , ((int , T ),))
7705
+ self .assertEqual (A3 [str ], Base [[int , str ]])
7706
+
7707
+ A4 = Base [[T , int , T2 ]]
7708
+ self .assertEqual (A4 .__parameters__ , (T , T2 ))
7709
+ self .assertEqual (A4 .__args__ , ((T , int , T2 ),))
7710
+ self .assertEqual (A4 [str , bool ], Base [[str , int , bool ]])
7711
+
7712
+ A5 = Base [[* Ts , int ]]
7713
+ self .assertEqual (A5 .__parameters__ , (Ts ,))
7714
+ self .assertEqual (A5 .__args__ , ((* Ts , int ),))
7715
+ self .assertEqual (A5 [str , bool ], Base [[str , bool , int ]])
7716
+
7717
+ A5_2 = Base [[int , * Ts ]]
7718
+ self .assertEqual (A5_2 .__parameters__ , (Ts ,))
7719
+ self .assertEqual (A5_2 .__args__ , ((int , * Ts ),))
7720
+ self .assertEqual (A5_2 [str , bool ], Base [[int , str , bool ]])
7721
+
7722
+ A6 = Base [[T , * Ts ]]
7723
+ self .assertEqual (A6 .__parameters__ , (T , Ts ))
7724
+ self .assertEqual (A6 .__args__ , ((T , * Ts ),))
7725
+ self .assertEqual (A6 [int , str , bool ], Base [[int , str , bool ]])
7726
+
7727
+ A7 = Base [[T , T ]]
7728
+ self .assertEqual (A7 .__parameters__ , (T ,))
7729
+ self .assertEqual (A7 .__args__ , ((T , T ),))
7730
+ self .assertEqual (A7 [int ], Base [[int , int ]])
7731
+
7732
+ A8 = Base [[T , list [T ]]]
7733
+ self .assertEqual (A8 .__parameters__ , (T ,))
7734
+ self .assertEqual (A8 .__args__ , ((T , list [T ]),))
7735
+ self .assertEqual (A8 [int ], Base [[int , list [int ]]])
7736
+
7737
+ A9 = Base [[Tuple [* Ts ], * Ts ]]
7738
+ self .assertEqual (A9 .__parameters__ , (Ts ,))
7739
+ self .assertEqual (A9 .__args__ , ((Tuple [* Ts ], * Ts ),))
7740
+ self .assertEqual (A9 [int , str ], Base [Tuple [int , str ], int , str ])
7741
+
7742
+ A10 = Base [P2 ]
7743
+ self .assertEqual (A10 .__parameters__ , (P2 ,))
7744
+ self .assertEqual (A10 .__args__ , (P2 ,))
7745
+ self .assertEqual (A10 [[int , str ]], Base [[int , str ]])
7746
+
7747
+ class DoubleP (Generic [P , P2 ]):
7748
+ pass
7749
+
7750
+ B1 = DoubleP [P , P2 ]
7751
+ self .assertEqual (B1 .__parameters__ , (P , P2 ))
7752
+ self .assertEqual (B1 .__args__ , (P , P2 ))
7753
+ self .assertEqual (B1 [[int , str ], [bool ]], DoubleP [[int , str ], [bool ]])
7754
+ self .assertEqual (B1 [[], []], DoubleP [[], []])
7755
+
7756
+ B2 = DoubleP [[int , str ], P2 ]
7757
+ self .assertEqual (B2 .__parameters__ , (P2 ,))
7758
+ self .assertEqual (B2 .__args__ , ((int , str ), P2 ))
7759
+ self .assertEqual (B2 [[bool , bool ]], DoubleP [[int , str ], [bool , bool ]])
7760
+ self .assertEqual (B2 [[]], DoubleP [[int , str ], []])
7761
+
7762
+ B3 = DoubleP [P , [bool , bool ]]
7763
+ self .assertEqual (B3 .__parameters__ , (P ,))
7764
+ self .assertEqual (B3 .__args__ , (P , (bool , bool )))
7765
+ self .assertEqual (B3 [[int , str ]], DoubleP [[int , str ], [bool , bool ]])
7766
+ self .assertEqual (B3 [[]], DoubleP [[], [bool , bool ]])
7767
+
7768
+ B4 = DoubleP [[T , int ], [bool , T2 ]]
7769
+ self .assertEqual (B4 .__parameters__ , (T , T2 ))
7770
+ self .assertEqual (B4 .__args__ , ((T , int ), (bool , T2 )))
7771
+ self .assertEqual (B4 [str , float ], DoubleP [[str , int ], [bool , float ]])
7772
+
7773
+ B5 = DoubleP [[* Ts , int ], [bool , T2 ]]
7774
+ self .assertEqual (B5 .__parameters__ , (Ts , T2 ))
7775
+ self .assertEqual (B5 .__args__ , ((* Ts , int ), (bool , T2 )))
7776
+ self .assertEqual (B5 [str , bytes , float ],
7777
+ DoubleP [[str , bytes , int ], [bool , float ]])
7778
+
7779
+ B6 = DoubleP [[T , int ], [bool , * Ts ]]
7780
+ self .assertEqual (B6 .__parameters__ , (T , Ts ))
7781
+ self .assertEqual (B6 .__args__ , ((T , int ), (bool , * Ts )))
7782
+ self .assertEqual (B6 [str , bytes , float ],
7783
+ DoubleP [[str , int ], [bool , bytes , float ]])
7784
+
7785
+ class PandT (Generic [P , T ]):
7786
+ pass
7787
+
7788
+ C1 = PandT [P , T ]
7789
+ self .assertEqual (C1 .__parameters__ , (P , T ))
7790
+ self .assertEqual (C1 .__args__ , (P , T ))
7791
+ self .assertEqual (C1 [[int , str ], bool ], PandT [[int , str ], bool ])
7792
+
7793
+ C2 = PandT [[int , T ], T ]
7794
+ self .assertEqual (C2 .__parameters__ , (T ,))
7795
+ self .assertEqual (C2 .__args__ , ((int , T ), T ))
7796
+ self .assertEqual (C2 [str ], PandT [[int , str ], str ])
7797
+
7798
+ C3 = PandT [[int , * Ts ], T ]
7799
+ self .assertEqual (C3 .__parameters__ , (Ts , T ))
7800
+ self .assertEqual (C3 .__args__ , ((int , * Ts ), T ))
7801
+ self .assertEqual (C3 [str , bool , bytes ], PandT [[int , str , bool ], bytes ])
7802
+
7682
7803
def test_paramspec_in_nested_generics (self ):
7683
7804
# Although ParamSpec should not be found in __parameters__ of most
7684
7805
# generics, they probably should be found when nested in
0 commit comments