@@ -772,20 +772,42 @@ class C(Generic[*Ts]): pass
772
772
('generic[*Ts]' , '[*Ts]' , 'generic[*Ts]' ),
773
773
('generic[*Ts]' , '[T, *Ts]' , 'generic[T, *Ts]' ),
774
774
('generic[*Ts]' , '[*Ts, T]' , 'generic[*Ts, T]' ),
775
+ ('generic[T, *Ts]' , '[()]' , 'TypeError' ),
775
776
('generic[T, *Ts]' , '[int]' , 'generic[int]' ),
776
777
('generic[T, *Ts]' , '[int, str]' , 'generic[int, str]' ),
777
778
('generic[T, *Ts]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
779
+ ('generic[list[T], *Ts]' , '[()]' , 'TypeError' ),
778
780
('generic[list[T], *Ts]' , '[int]' , 'generic[list[int]]' ),
779
781
('generic[list[T], *Ts]' , '[int, str]' , 'generic[list[int], str]' ),
780
782
('generic[list[T], *Ts]' , '[int, str, bool]' , 'generic[list[int], str, bool]' ),
781
783
784
+ ('generic[*Ts, T]' , '[()]' , 'TypeError' ),
782
785
('generic[*Ts, T]' , '[int]' , 'generic[int]' ),
783
786
('generic[*Ts, T]' , '[int, str]' , 'generic[int, str]' ),
784
787
('generic[*Ts, T]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
788
+ ('generic[*Ts, list[T]]' , '[()]' , 'TypeError' ),
785
789
('generic[*Ts, list[T]]' , '[int]' , 'generic[list[int]]' ),
786
790
('generic[*Ts, list[T]]' , '[int, str]' , 'generic[int, list[str]]' ),
787
791
('generic[*Ts, list[T]]' , '[int, str, bool]' , 'generic[int, str, list[bool]]' ),
788
792
793
+ ('generic[T1, T2, *Ts]' , '[()]' , 'TypeError' ),
794
+ ('generic[T1, T2, *Ts]' , '[int]' , 'TypeError' ),
795
+ ('generic[T1, T2, *Ts]' , '[int, str]' , 'generic[int, str]' ),
796
+ ('generic[T1, T2, *Ts]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
797
+ ('generic[T1, T2, *Ts]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
798
+
799
+ ('generic[*Ts, T1, T2]' , '[()]' , 'TypeError' ),
800
+ ('generic[*Ts, T1, T2]' , '[int]' , 'TypeError' ),
801
+ ('generic[*Ts, T1, T2]' , '[int, str]' , 'generic[int, str]' ),
802
+ ('generic[*Ts, T1, T2]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
803
+ ('generic[*Ts, T1, T2]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
804
+
805
+ ('generic[T1, *Ts, T2]' , '[()]' , 'TypeError' ),
806
+ ('generic[T1, *Ts, T2]' , '[int]' , 'TypeError' ),
807
+ ('generic[T1, *Ts, T2]' , '[int, str]' , 'generic[int, str]' ),
808
+ ('generic[T1, *Ts, T2]' , '[int, str, bool]' , 'generic[int, str, bool]' ),
809
+ ('generic[T1, *Ts, T2]' , '[int, str, bool, bytes]' , 'generic[int, str, bool, bytes]' ),
810
+
789
811
('generic[T, *Ts]' , '[*tuple_type[int, ...]]' , 'generic[int, *tuple_type[int, ...]]' ),
790
812
('generic[T, *Ts]' , '[str, *tuple_type[int, ...]]' , 'generic[str, *tuple_type[int, ...]]' ),
791
813
('generic[T, *Ts]' , '[*tuple_type[int, ...], str]' , 'generic[int, *tuple_type[int, ...], str]' ),
@@ -7241,6 +7263,65 @@ class X(Generic[P, P2]):
7241
7263
self .assertEqual (G1 .__args__ , ((int , str ), (bytes ,)))
7242
7264
self .assertEqual (G2 .__args__ , ((int ,), (str , bytes )))
7243
7265
7266
+ def test_typevartuple_and_paramspecs_in_user_generics (self ):
7267
+ Ts = TypeVarTuple ("Ts" )
7268
+ P = ParamSpec ("P" )
7269
+
7270
+ class X (Generic [* Ts , P ]):
7271
+ f : Callable [P , int ]
7272
+ g : Tuple [* Ts ]
7273
+
7274
+ G1 = X [int , [bytes ]]
7275
+ self .assertEqual (G1 .__args__ , (int , (bytes ,)))
7276
+ G2 = X [int , str , [bytes ]]
7277
+ self .assertEqual (G2 .__args__ , (int , str , (bytes ,)))
7278
+ G3 = X [[bytes ]]
7279
+ self .assertEqual (G3 .__args__ , ((bytes ,),))
7280
+ G4 = X [[]]
7281
+ self .assertEqual (G4 .__args__ , ((),))
7282
+ with self .assertRaises (TypeError ):
7283
+ X [()]
7284
+
7285
+ class Y (Generic [P , * Ts ]):
7286
+ f : Callable [P , int ]
7287
+ g : Tuple [* Ts ]
7288
+
7289
+ G1 = Y [[bytes ], int ]
7290
+ self .assertEqual (G1 .__args__ , ((bytes ,), int ))
7291
+ G2 = Y [[bytes ], int , str ]
7292
+ self .assertEqual (G2 .__args__ , ((bytes ,), int , str ))
7293
+ G3 = Y [[bytes ]]
7294
+ self .assertEqual (G3 .__args__ , ((bytes ,),))
7295
+ G4 = Y [[]]
7296
+ self .assertEqual (G4 .__args__ , ((),))
7297
+ with self .assertRaises (TypeError ):
7298
+ Y [()]
7299
+
7300
+ def test_typevartuple_and_paramspecs_in_generic_aliases (self ):
7301
+ P = ParamSpec ('P' )
7302
+ T = TypeVar ('T' )
7303
+ Ts = TypeVarTuple ('Ts' )
7304
+
7305
+ for C in Callable , collections .abc .Callable :
7306
+ with self .subTest (generic = C ):
7307
+ A = C [P , Tuple [* Ts ]]
7308
+ B = A [[int , str ], bytes , float ]
7309
+ self .assertEqual (B .__args__ , (int , str , Tuple [bytes , float ]))
7310
+
7311
+ class X (Generic [T , P ]):
7312
+ pass
7313
+
7314
+ A = X [Tuple [* Ts ], P ]
7315
+ B = A [bytes , float , [int , str ]]
7316
+ self .assertEqual (B .__args__ , (Tuple [bytes , float ], (int , str ,)))
7317
+
7318
+ class Y (Generic [P , T ]):
7319
+ pass
7320
+
7321
+ A = Y [P , Tuple [* Ts ]]
7322
+ B = A [[int , str ], bytes , float ]
7323
+ self .assertEqual (B .__args__ , ((int , str ,), Tuple [bytes , float ]))
7324
+
7244
7325
def test_var_substitution (self ):
7245
7326
T = TypeVar ("T" )
7246
7327
P = ParamSpec ("P" )
0 commit comments