@@ -769,20 +769,42 @@ class C(Generic[*Ts]): pass
769
769
('generic[*Ts]' , '[*Ts]' , 'generic[*Ts]' ),
770
770
('generic[*Ts]' , '[T, *Ts]' , 'generic[T, *Ts]' ),
771
771
('generic[*Ts]' , '[*Ts, T]' , 'generic[*Ts, T]' ),
772
+ ('generic[T, *Ts]' , '[()]' , 'TypeError' ),
772
773
('generic[T, *Ts]' , '[int]' , 'generic[int]' ),
773
774
('generic[T, *Ts]' , '[int, str]' , 'generic[int, str]' ),
774
775
('generic[T, *Ts]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
776
+ ('generic[list[T], *Ts]' , '[()]' , 'TypeError' ),
775
777
('generic[list[T], *Ts]' , '[int]' , 'generic[list[int]]' ),
776
778
('generic[list[T], *Ts]' , '[int, str]' , 'generic[list[int], str]' ),
777
779
('generic[list[T], *Ts]' , '[int, str, bool]' , 'generic[list[int], str, bool]' ),
778
780
781
+ ('generic[*Ts, T]' , '[()]' , 'TypeError' ),
779
782
('generic[*Ts, T]' , '[int]' , 'generic[int]' ),
780
783
('generic[*Ts, T]' , '[int, str]' , 'generic[int, str]' ),
781
784
('generic[*Ts, T]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
785
+ ('generic[*Ts, list[T]]' , '[()]' , 'TypeError' ),
782
786
('generic[*Ts, list[T]]' , '[int]' , 'generic[list[int]]' ),
783
787
('generic[*Ts, list[T]]' , '[int, str]' , 'generic[int, list[str]]' ),
784
788
('generic[*Ts, list[T]]' , '[int, str, bool]' , 'generic[int, str, list[bool]]' ),
785
789
790
+ ('generic[T1, T2, *Ts]' , '[()]' , 'TypeError' ),
791
+ ('generic[T1, T2, *Ts]' , '[int]' , 'TypeError' ),
792
+ ('generic[T1, T2, *Ts]' , '[int, str]' , 'generic[int, str]' ),
793
+ ('generic[T1, T2, *Ts]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
794
+ ('generic[T1, T2, *Ts]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
795
+
796
+ ('generic[*Ts, T1, T2]' , '[()]' , 'TypeError' ),
797
+ ('generic[*Ts, T1, T2]' , '[int]' , 'TypeError' ),
798
+ ('generic[*Ts, T1, T2]' , '[int, str]' , 'generic[int, str]' ),
799
+ ('generic[*Ts, T1, T2]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
800
+ ('generic[*Ts, T1, T2]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
801
+
802
+ ('generic[T1, *Ts, T2]' , '[()]' , 'TypeError' ),
803
+ ('generic[T1, *Ts, T2]' , '[int]' , 'TypeError' ),
804
+ ('generic[T1, *Ts, T2]' , '[int, str]' , 'generic[int, str]' ),
805
+ ('generic[T1, *Ts, T2]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
806
+ ('generic[T1, *Ts, T2]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
807
+
786
808
('generic[T, *Ts]' , '[*tuple_type[int, ...]]' , 'generic[int, *tuple_type[int, ...]]' ),
787
809
('generic[T, *Ts]' , '[str, *tuple_type[int, ...]]' , 'generic[str, *tuple_type[int, ...]]' ),
788
810
('generic[T, *Ts]' , '[*tuple_type[int, ...], str]' , 'generic[int, *tuple_type[int, ...], str]' ),
@@ -7190,6 +7212,65 @@ class X(Generic[P, P2]):
7190
7212
self .assertEqual (G1 .__args__ , ((int , str ), (bytes ,)))
7191
7213
self .assertEqual (G2 .__args__ , ((int ,), (str , bytes )))
7192
7214
7215
+ def test_typevartuple_and_paramspecs_in_user_generics (self ):
7216
+ Ts = TypeVarTuple ("Ts" )
7217
+ P = ParamSpec ("P" )
7218
+
7219
+ class X (Generic [* Ts , P ]):
7220
+ f : Callable [P , int ]
7221
+ g : Tuple [* Ts ]
7222
+
7223
+ G1 = X [int , [bytes ]]
7224
+ self .assertEqual (G1 .__args__ , (int , (bytes ,)))
7225
+ G2 = X [int , str , [bytes ]]
7226
+ self .assertEqual (G2 .__args__ , (int , str , (bytes ,)))
7227
+ G3 = X [[bytes ]]
7228
+ self .assertEqual (G3 .__args__ , ((bytes ,),))
7229
+ G4 = X [[]]
7230
+ self .assertEqual (G4 .__args__ , ((),))
7231
+ with self .assertRaises (TypeError ):
7232
+ X [()]
7233
+
7234
+ class Y (Generic [P , * Ts ]):
7235
+ f : Callable [P , int ]
7236
+ g : Tuple [* Ts ]
7237
+
7238
+ G1 = Y [[bytes ], int ]
7239
+ self .assertEqual (G1 .__args__ , ((bytes ,), int ))
7240
+ G2 = Y [[bytes ], int , str ]
7241
+ self .assertEqual (G2 .__args__ , ((bytes ,), int , str ))
7242
+ G3 = Y [[bytes ]]
7243
+ self .assertEqual (G3 .__args__ , ((bytes ,),))
7244
+ G4 = Y [[]]
7245
+ self .assertEqual (G4 .__args__ , ((),))
7246
+ with self .assertRaises (TypeError ):
7247
+ Y [()]
7248
+
7249
+ def test_typevartuple_and_paramspecs_in_generic_aliases (self ):
7250
+ P = ParamSpec ('P' )
7251
+ T = TypeVar ('T' )
7252
+ Ts = TypeVarTuple ('Ts' )
7253
+
7254
+ for C in Callable , collections .abc .Callable :
7255
+ with self .subTest (generic = C ):
7256
+ A = C [P , Tuple [* Ts ]]
7257
+ B = A [[int , str ], bytes , float ]
7258
+ self .assertEqual (B .__args__ , (int , str , Tuple [bytes , float ]))
7259
+
7260
+ class X (Generic [T , P ]):
7261
+ pass
7262
+
7263
+ A = X [Tuple [* Ts ], P ]
7264
+ B = A [bytes , float , [int , str ]]
7265
+ self .assertEqual (B .__args__ , (Tuple [bytes , float ], (int , str ,)))
7266
+
7267
+ class Y (Generic [P , T ]):
7268
+ pass
7269
+
7270
+ A = Y [P , Tuple [* Ts ]]
7271
+ B = A [[int , str ], bytes , float ]
7272
+ self .assertEqual (B .__args__ , ((int , str ,), Tuple [bytes , float ]))
7273
+
7193
7274
def test_var_substitution (self ):
7194
7275
T = TypeVar ("T" )
7195
7276
P = ParamSpec ("P" )
0 commit comments