@@ -62,7 +62,6 @@ class BaseTest(unittest.TestCase):
6262 Iterable , Iterator ,
6363 Reversible ,
6464 Container , Collection ,
65- Callable ,
6665 Mailbox , _PartialFile ,
6766 ContextVar , Token ,
6867 Field ,
@@ -307,6 +306,63 @@ def test_no_kwargs(self):
307306 with self .assertRaises (TypeError ):
308307 GenericAlias (bad = float )
309308
309+ def test_subclassing_types_genericalias (self ):
310+ class SubClass (GenericAlias ): ...
311+ alias = SubClass (list , int )
312+ class Bad (GenericAlias ):
313+ def __new__ (cls , * args , ** kwargs ):
314+ super ().__new__ (cls , * args , ** kwargs )
315+
316+ self .assertEqual (alias , list [int ])
317+ with self .assertRaises (TypeError ):
318+ Bad (list , int , bad = int )
319+
320+ def test_abc_callable (self ):
321+ # A separate test is needed for Callable since it uses a subclass of
322+ # GenericAlias.
323+ alias = Callable [[int , str ], float ]
324+ with self .subTest ("Testing subscription" ):
325+ self .assertIs (alias .__origin__ , Callable )
326+ self .assertEqual (alias .__args__ , (int , str , float ))
327+ self .assertEqual (alias .__parameters__ , ())
328+
329+ with self .subTest ("Testing instance checks" ):
330+ self .assertIsInstance (alias , GenericAlias )
331+
332+ with self .subTest ("Testing weakref" ):
333+ self .assertEqual (ref (alias )(), alias )
334+
335+ with self .subTest ("Testing pickling" ):
336+ s = pickle .dumps (alias )
337+ loaded = pickle .loads (s )
338+ self .assertEqual (alias .__origin__ , loaded .__origin__ )
339+ self .assertEqual (alias .__args__ , loaded .__args__ )
340+ self .assertEqual (alias .__parameters__ , loaded .__parameters__ )
341+
342+ with self .subTest ("Testing TypeVar substitution" ):
343+ C1 = Callable [[int , T ], T ]
344+ C2 = Callable [[K , T ], V ]
345+ C3 = Callable [..., T ]
346+ self .assertEqual (C1 [str ], Callable [[int , str ], str ])
347+ self .assertEqual (C2 [int , float , str ], Callable [[int , float ], str ])
348+ self .assertEqual (C3 [int ], Callable [..., int ])
349+
350+ with self .subTest ("Testing type erasure" ):
351+ class C1 (Callable ):
352+ def __call__ (self ):
353+ return None
354+ a = C1 [[int ], T ]
355+ self .assertIs (a ().__class__ , C1 )
356+ self .assertEqual (a ().__orig_class__ , C1 [[int ], T ])
357+
358+ # bpo-42195
359+ with self .subTest ("Testing collections.abc.Callable's consistency "
360+ "with typing.Callable" ):
361+ c1 = typing .Callable [[int , str ], dict ]
362+ c2 = Callable [[int , str ], dict ]
363+ self .assertEqual (c1 .__args__ , c2 .__args__ )
364+ self .assertEqual (hash (c1 .__args__ ), hash (c2 .__args__ ))
365+
310366
311367if __name__ == "__main__" :
312368 unittest .main ()
0 commit comments