47
47
from queue import Queue , SimpleQueue
48
48
from weakref import WeakSet , ReferenceType , ref
49
49
import typing
50
+ from typing import Unpack
50
51
51
52
from typing import TypeVar
52
53
T = TypeVar ('T' )
53
54
K = TypeVar ('K' )
54
55
V = TypeVar ('V' )
55
56
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
+
56
88
class BaseTest (unittest .TestCase ):
57
89
"""Test basics."""
58
90
generic_types = [type , tuple , list , dict , set , frozenset , enumerate ,
@@ -351,13 +383,15 @@ class MyType(type):
351
383
MyType [int ]
352
384
353
385
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__ )
361
395
362
396
def test_copy (self ):
363
397
class X (list ):
@@ -366,16 +400,21 @@ def __copy__(self):
366
400
def __deepcopy__ (self , memo ):
367
401
return self
368
402
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__ )
379
418
380
419
def test_union (self ):
381
420
a = typing .Union [list [int ], list [str ]]
0 commit comments