4747from queue import Queue , SimpleQueue
4848from weakref import WeakSet , ReferenceType , ref
4949import typing
50+ from typing import Unpack
5051
5152from typing import TypeVar
5253T = TypeVar ('T' )
5354K = TypeVar ('K' )
5455V = TypeVar ('V' )
5556
57+ _UNPACKED_TUPLES = [
58+ # Unpacked tuple using `*`
59+ (* tuple [int ],)[0 ],
60+ (* tuple [T ],)[0 ],
61+ (* tuple [int , str ],)[0 ],
62+ (* tuple [int , ...],)[0 ],
63+ (* tuple [T , ...],)[0 ],
64+ tuple [* tuple [int , ...]],
65+ tuple [* tuple [T , ...]],
66+ tuple [str , * tuple [int , ...]],
67+ tuple [* tuple [int , ...], str ],
68+ tuple [float , * tuple [int , ...], str ],
69+ tuple [* tuple [* tuple [int , ...]]],
70+ # Unpacked tuple using `Unpack`
71+ Unpack [tuple [int ]],
72+ Unpack [tuple [T ]],
73+ Unpack [tuple [int , str ]],
74+ Unpack [tuple [int , ...]],
75+ Unpack [tuple [T , ...]],
76+ tuple [Unpack [tuple [int , ...]]],
77+ tuple [Unpack [tuple [T , ...]]],
78+ tuple [str , Unpack [tuple [int , ...]]],
79+ tuple [Unpack [tuple [int , ...]], str ],
80+ tuple [float , Unpack [tuple [int , ...]], str ],
81+ tuple [Unpack [tuple [Unpack [tuple [int , ...]]]]],
82+ # Unpacked tuple using `*` AND `Unpack`
83+ tuple [Unpack [tuple [* tuple [int , ...]]]],
84+ tuple [* tuple [Unpack [tuple [int , ...]]]],
85+ ]
86+
87+
5688class BaseTest (unittest .TestCase ):
5789 """Test basics."""
5890 generic_types = [type , tuple , list , dict , set , frozenset , enumerate ,
@@ -351,13 +383,15 @@ class MyType(type):
351383 MyType [int ]
352384
353385 def test_pickle (self ):
354- alias = GenericAlias (list , T )
355- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
356- s = pickle .dumps (alias , proto )
357- loaded = pickle .loads (s )
358- self .assertEqual (loaded .__origin__ , alias .__origin__ )
359- self .assertEqual (loaded .__args__ , alias .__args__ )
360- self .assertEqual (loaded .__parameters__ , alias .__parameters__ )
386+ aliases = [GenericAlias (list , T )] + _UNPACKED_TUPLES
387+ for alias in aliases :
388+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
389+ with self .subTest (alias = alias , proto = proto ):
390+ s = pickle .dumps (alias , proto )
391+ loaded = pickle .loads (s )
392+ self .assertEqual (loaded .__origin__ , alias .__origin__ )
393+ self .assertEqual (loaded .__args__ , alias .__args__ )
394+ self .assertEqual (loaded .__parameters__ , alias .__parameters__ )
361395
362396 def test_copy (self ):
363397 class X (list ):
@@ -366,16 +400,21 @@ def __copy__(self):
366400 def __deepcopy__ (self , memo ):
367401 return self
368402
369- for origin in list , deque , X :
370- alias = GenericAlias (origin , T )
371- copied = copy .copy (alias )
372- self .assertEqual (copied .__origin__ , alias .__origin__ )
373- self .assertEqual (copied .__args__ , alias .__args__ )
374- self .assertEqual (copied .__parameters__ , alias .__parameters__ )
375- copied = copy .deepcopy (alias )
376- self .assertEqual (copied .__origin__ , alias .__origin__ )
377- self .assertEqual (copied .__args__ , alias .__args__ )
378- self .assertEqual (copied .__parameters__ , alias .__parameters__ )
403+ aliases = [
404+ GenericAlias (list , T ),
405+ GenericAlias (deque , T ),
406+ GenericAlias (X , T )
407+ ] + _UNPACKED_TUPLES
408+ for alias in aliases :
409+ with self .subTest (alias = alias ):
410+ copied = copy .copy (alias )
411+ self .assertEqual (copied .__origin__ , alias .__origin__ )
412+ self .assertEqual (copied .__args__ , alias .__args__ )
413+ self .assertEqual (copied .__parameters__ , alias .__parameters__ )
414+ copied = copy .deepcopy (alias )
415+ self .assertEqual (copied .__origin__ , alias .__origin__ )
416+ self .assertEqual (copied .__args__ , alias .__args__ )
417+ self .assertEqual (copied .__parameters__ , alias .__parameters__ )
379418
380419 def test_union (self ):
381420 a = typing .Union [list [int ], list [str ]]
0 commit comments