@@ -1235,15 +1235,15 @@ def test_weakref(self):
12351235 alias = Callable [[int , str ], float ]
12361236 self .assertEqual (weakref .ref (alias )(), alias )
12371237
1238- def test_pickle (self ):
1238+ @all_pickle_protocols
1239+ def test_pickle (self , proto ):
12391240 Callable = self .Callable
12401241 alias = Callable [[int , str ], float ]
1241- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
1242- s = pickle .dumps (alias , proto )
1243- loaded = pickle .loads (s )
1244- self .assertEqual (alias .__origin__ , loaded .__origin__ )
1245- self .assertEqual (alias .__args__ , loaded .__args__ )
1246- self .assertEqual (alias .__parameters__ , loaded .__parameters__ )
1242+ s = pickle .dumps (alias , proto )
1243+ loaded = pickle .loads (s )
1244+ self .assertEqual (alias .__origin__ , loaded .__origin__ )
1245+ self .assertEqual (alias .__args__ , loaded .__args__ )
1246+ self .assertEqual (alias .__parameters__ , loaded .__parameters__ )
12471247
12481248 def test_var_substitution (self ):
12491249 Callable = self .Callable
@@ -2218,7 +2218,8 @@ class P(Protocol):
22182218 Alias2 = typing .Union [P , typing .Iterable ]
22192219 self .assertEqual (Alias , Alias2 )
22202220
2221- def test_protocols_pickleable (self ):
2221+ @all_pickle_protocols
2222+ def test_protocols_pickleable (self , proto ):
22222223 global P , CP # pickle wants to reference the class by name
22232224 T = TypeVar ('T' )
22242225
@@ -2232,20 +2233,20 @@ class CP(P[int]):
22322233 c = CP ()
22332234 c .foo = 42
22342235 c .bar = 'abc'
2235- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
2236- z = pickle .dumps (c , proto )
2237- x = pickle .loads (z )
2238- self .assertEqual (x .foo , 42 )
2239- self .assertEqual (x .bar , 'abc' )
2240- self .assertEqual (x .x , 1 )
2241- self .assertEqual (x .__dict__ , {'foo' : 42 , 'bar' : 'abc' })
2242- s = pickle .dumps (P )
2243- D = pickle .loads (s )
22442236
2245- class E :
2246- x = 1
2237+ z = pickle .dumps (c , proto )
2238+ x = pickle .loads (z )
2239+ self .assertEqual (x .foo , 42 )
2240+ self .assertEqual (x .bar , 'abc' )
2241+ self .assertEqual (x .x , 1 )
2242+ self .assertEqual (x .__dict__ , {'foo' : 42 , 'bar' : 'abc' })
2243+ s = pickle .dumps (P )
2244+ D = pickle .loads (s )
22472245
2248- self .assertIsInstance (E (), D )
2246+ class E :
2247+ x = 1
2248+
2249+ self .assertIsInstance (E (), D )
22492250
22502251 def test_supports_int (self ):
22512252 self .assertIsSubclass (int , typing .SupportsInt )
@@ -2844,7 +2845,8 @@ def test_all_repr_eq_any(self):
28442845 self .assertNotEqual (repr (base ), '' )
28452846 self .assertEqual (base , base )
28462847
2847- def test_pickle (self ):
2848+ @all_pickle_protocols
2849+ def test_pickle (self , proto ):
28482850 global C # pickle wants to reference the class by name
28492851 T = TypeVar ('T' )
28502852
@@ -2857,27 +2859,26 @@ class C(B[int]):
28572859 c = C ()
28582860 c .foo = 42
28592861 c .bar = 'abc'
2860- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
2861- z = pickle .dumps (c , proto )
2862- x = pickle .loads (z )
2863- self .assertEqual (x .foo , 42 )
2864- self .assertEqual (x .bar , 'abc' )
2865- self .assertEqual (x .__dict__ , {'foo' : 42 , 'bar' : 'abc' })
2862+
2863+ z = pickle .dumps (c , proto )
2864+ x = pickle .loads (z )
2865+ self .assertEqual (x .foo , 42 )
2866+ self .assertEqual (x .bar , 'abc' )
2867+ self .assertEqual (x .__dict__ , {'foo' : 42 , 'bar' : 'abc' })
2868+
28662869 samples = [Any , Union , Tuple , Callable , ClassVar ,
28672870 Union [int , str ], ClassVar [List ], Tuple [int , ...], Callable [[str ], bytes ],
28682871 typing .DefaultDict , typing .FrozenSet [int ]]
28692872 for s in samples :
2870- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
2871- z = pickle .dumps (s , proto )
2872- x = pickle .loads (z )
2873- self .assertEqual (s , x )
2873+ z = pickle .dumps (s , proto )
2874+ x = pickle .loads (z )
2875+ self .assertEqual (s , x )
28742876 more_samples = [List , typing .Iterable , typing .Type , List [int ],
28752877 typing .Type [typing .Mapping ], typing .AbstractSet [Tuple [int , str ]]]
28762878 for s in more_samples :
2877- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
2878- z = pickle .dumps (s , proto )
2879- x = pickle .loads (z )
2880- self .assertEqual (s , x )
2879+ z = pickle .dumps (s , proto )
2880+ x = pickle .loads (z )
2881+ self .assertEqual (s , x )
28812882
28822883 def test_copy_and_deepcopy (self ):
28832884 T = TypeVar ('T' )
@@ -2891,7 +2892,8 @@ class Node(Generic[T]): ...
28912892 self .assertEqual (t , copy (t ))
28922893 self .assertEqual (t , deepcopy (t ))
28932894
2894- def test_immutability_by_copy_and_pickle (self ):
2895+ @all_pickle_protocols
2896+ def test_immutability_by_copy_and_pickle (self , proto ):
28952897 # Special forms like Union, Any, etc., generic aliases to containers like List,
28962898 # Mapping, etc., and type variabcles are considered immutable by copy and pickle.
28972899 global TP , TPB , TPV , PP # for pickle
@@ -2905,8 +2907,7 @@ def test_immutability_by_copy_and_pickle(self):
29052907 with self .subTest (thing = X ):
29062908 self .assertIs (copy (X ), X )
29072909 self .assertIs (deepcopy (X ), X )
2908- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
2909- self .assertIs (pickle .loads (pickle .dumps (X , proto )), X )
2910+ self .assertIs (pickle .loads (pickle .dumps (X , proto )), X )
29102911 del TP , TPB , TPV , PP
29112912
29122913 # Check that local type variables are copyable.
@@ -4977,20 +4978,20 @@ def test_repr(self):
49774978 self .assertEqual (repr (self .UserName ),
49784979 f'{ __name__ } .{ self .__class__ .__qualname__ } .UserName' )
49794980
4980- def test_pickle (self ):
4981+ @all_pickle_protocols
4982+ def test_pickle (self , proto ):
49814983 UserAge = self .module .NewType ('UserAge' , float )
4982- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
4983- with self .subTest (proto = proto ):
4984- pickled = pickle .dumps (UserId , proto )
4985- loaded = pickle .loads (pickled )
4986- self .assertIs (loaded , UserId )
49874984
4988- pickled = pickle .dumps (self .UserName , proto )
4989- loaded = pickle .loads (pickled )
4990- self .assertIs (loaded , self .UserName )
4985+ pickled = pickle .dumps (UserId , proto )
4986+ loaded = pickle .loads (pickled )
4987+ self .assertIs (loaded , UserId )
4988+
4989+ pickled = pickle .dumps (self .UserName , proto )
4990+ loaded = pickle .loads (pickled )
4991+ self .assertIs (loaded , self .UserName )
49914992
4992- with self .assertRaises (pickle .PicklingError ):
4993- pickle .dumps (UserAge , proto )
4993+ with self .assertRaises (pickle .PicklingError ):
4994+ pickle .dumps (UserAge , proto )
49944995
49954996 def test_missing__name__ (self ):
49964997 code = ("import typing\n "
@@ -5142,17 +5143,18 @@ def test_namedtuple_errors(self):
51425143 with self .assertRaises (TypeError ):
51435144 NamedTuple (typename = 'Emp' , name = str , id = int )
51445145
5145- def test_copy_and_pickle (self ):
5146+ @all_pickle_protocols
5147+ def test_copy_and_pickle (self , proto ):
51465148 global Emp # pickle wants to reference the class by name
51475149 Emp = NamedTuple ('Emp' , [('name' , str ), ('cool' , int )])
51485150 for cls in Emp , CoolEmployee , self .NestedEmployee :
51495151 with self .subTest (cls = cls ):
51505152 jane = cls ('jane' , 37 )
5151- for proto in range ( pickle . HIGHEST_PROTOCOL + 1 ):
5152- z = pickle .dumps (jane , proto )
5153- jane2 = pickle .loads (z )
5154- self .assertEqual (jane2 , jane )
5155- self .assertIsInstance (jane2 , cls )
5153+
5154+ z = pickle .dumps (jane , proto )
5155+ jane2 = pickle .loads (z )
5156+ self .assertEqual (jane2 , jane )
5157+ self .assertIsInstance (jane2 , cls )
51565158
51575159 jane2 = copy (jane )
51585160 self .assertEqual (jane2 , jane )
@@ -5244,18 +5246,19 @@ def test_py36_class_syntax_usage(self):
52445246 other = LabelPoint2D (x = 0 , y = 1 , label = 'hi' )
52455247 self .assertEqual (other ['label' ], 'hi' )
52465248
5247- def test_pickle (self ):
5249+ @all_pickle_protocols
5250+ def test_pickle (self , proto ):
52485251 global EmpD # pickle wants to reference the class by name
52495252 EmpD = TypedDict ('EmpD' , {'name' : str , 'id' : int })
52505253 jane = EmpD ({'name' : 'jane' , 'id' : 37 })
5251- for proto in range ( pickle . HIGHEST_PROTOCOL + 1 ):
5252- z = pickle .dumps (jane , proto )
5253- jane2 = pickle .loads (z )
5254- self .assertEqual (jane2 , jane )
5255- self .assertEqual (jane2 , {'name' : 'jane' , 'id' : 37 })
5256- ZZ = pickle .dumps (EmpD , proto )
5257- EmpDnew = pickle .loads (ZZ )
5258- self .assertEqual (EmpDnew ({'name' : 'jane' , 'id' : 37 }), jane )
5254+
5255+ z = pickle .dumps (jane , proto )
5256+ jane2 = pickle .loads (z )
5257+ self .assertEqual (jane2 , jane )
5258+ self .assertEqual (jane2 , {'name' : 'jane' , 'id' : 37 })
5259+ ZZ = pickle .dumps (EmpD , proto )
5260+ EmpDnew = pickle .loads (ZZ )
5261+ self .assertEqual (EmpDnew ({'name' : 'jane' , 'id' : 37 }), jane )
52595262
52605263 def test_optional (self ):
52615264 EmpD = TypedDict ('EmpD' , {'name' : str , 'id' : int })
@@ -5645,19 +5648,19 @@ def test_too_few_type_args(self):
56455648 with self .assertRaisesRegex (TypeError , 'at least two arguments' ):
56465649 Annotated [int ]
56475650
5648- def test_pickle (self ):
5651+ @all_pickle_protocols
5652+ def test_pickle (self , proto ):
56495653 samples = [typing .Any , typing .Union [int , str ],
56505654 typing .Optional [str ], Tuple [int , ...],
56515655 typing .Callable [[str ], bytes ]]
56525656
56535657 for t in samples :
56545658 x = Annotated [t , "a" ]
56555659
5656- for prot in range (pickle .HIGHEST_PROTOCOL + 1 ):
5657- with self .subTest (protocol = prot , type = t ):
5658- pickled = pickle .dumps (x , prot )
5659- restored = pickle .loads (pickled )
5660- self .assertEqual (x , restored )
5660+ with self .subTest (type = t ):
5661+ pickled = pickle .dumps (x , proto )
5662+ restored = pickle .loads (pickled )
5663+ self .assertEqual (x , restored )
56615664
56625665 global _Annotated_test_G
56635666
@@ -5668,12 +5671,11 @@ class _Annotated_test_G(Generic[T]):
56685671 G .foo = 42
56695672 G .bar = 'abc'
56705673
5671- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
5672- z = pickle .dumps (G , proto )
5673- x = pickle .loads (z )
5674- self .assertEqual (x .foo , 42 )
5675- self .assertEqual (x .bar , 'abc' )
5676- self .assertEqual (x .x , 1 )
5674+ z = pickle .dumps (G , proto )
5675+ x = pickle .loads (z )
5676+ self .assertEqual (x .foo , 42 )
5677+ self .assertEqual (x .bar , 'abc' )
5678+ self .assertEqual (x .x , 1 )
56775679
56785680 def test_subst (self ):
56795681 dec = "a decoration"
@@ -6040,7 +6042,8 @@ def test_no_isinstance(self):
60406042
60416043class SpecialAttrsTests (BaseTestCase ):
60426044
6043- def test_special_attrs (self ):
6045+ @all_pickle_protocols
6046+ def test_special_attrs (self , proto ):
60446047 cls_to_check = {
60456048 # ABC classes
60466049 typing .AbstractSet : 'AbstractSet' ,
@@ -6160,14 +6163,15 @@ def test_special_attrs(self):
61606163 self .assertEqual (cls .__name__ , name , str (cls ))
61616164 self .assertEqual (cls .__qualname__ , name , str (cls ))
61626165 self .assertEqual (cls .__module__ , 'typing' , str (cls ))
6163- for proto in range ( pickle . HIGHEST_PROTOCOL + 1 ):
6164- s = pickle .dumps (cls , proto )
6165- loaded = pickle .loads (s )
6166- self .assertIs (cls , loaded )
6166+
6167+ s = pickle .dumps (cls , proto )
6168+ loaded = pickle .loads (s )
6169+ self .assertIs (cls , loaded )
61676170
61686171 TypeName = typing .NewType ('SpecialAttrsTests.TypeName' , Any )
61696172
6170- def test_special_attrs2 (self ):
6173+ @all_pickle_protocols
6174+ def test_special_attrs2 (self , proto ):
61716175 # Forward refs provide a different introspection API. __name__ and
61726176 # __qualname__ make little sense for forward refs as they can store
61736177 # complex typing expressions.
@@ -6176,9 +6180,8 @@ def test_special_attrs2(self):
61766180 self .assertFalse (hasattr (fr , '__qualname__' ))
61776181 self .assertEqual (fr .__module__ , 'typing' )
61786182 # Forward refs are currently unpicklable.
6179- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
6180- with self .assertRaises (TypeError ) as exc :
6181- pickle .dumps (fr , proto )
6183+ with self .assertRaises (TypeError ) as exc :
6184+ pickle .dumps (fr , proto )
61826185
61836186 self .assertEqual (SpecialAttrsTests .TypeName .__name__ , 'TypeName' )
61846187 self .assertEqual (
@@ -6190,10 +6193,9 @@ def test_special_attrs2(self):
61906193 __name__ ,
61916194 )
61926195 # NewTypes are picklable assuming correct qualname information.
6193- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
6194- s = pickle .dumps (SpecialAttrsTests .TypeName , proto )
6195- loaded = pickle .loads (s )
6196- self .assertIs (SpecialAttrsTests .TypeName , loaded )
6196+ s = pickle .dumps (SpecialAttrsTests .TypeName )
6197+ loaded = pickle .loads (s )
6198+ self .assertIs (SpecialAttrsTests .TypeName , loaded )
61976199
61986200 # Type variables don't support non-global instantiation per PEP 484
61996201 # restriction that "The argument to TypeVar() must be a string equal
@@ -6203,19 +6205,17 @@ def test_special_attrs2(self):
62036205 self .assertFalse (hasattr (SpecialAttrsT , '__qualname__' ))
62046206 self .assertEqual (SpecialAttrsT .__module__ , __name__ )
62056207 # Module-level type variables are picklable.
6206- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
6207- s = pickle .dumps (SpecialAttrsT , proto )
6208- loaded = pickle .loads (s )
6209- self .assertIs (SpecialAttrsT , loaded )
6208+ s = pickle .dumps (SpecialAttrsT , proto )
6209+ loaded = pickle .loads (s )
6210+ self .assertIs (SpecialAttrsT , loaded )
62106211
62116212 self .assertEqual (SpecialAttrsP .__name__ , 'SpecialAttrsP' )
62126213 self .assertFalse (hasattr (SpecialAttrsP , '__qualname__' ))
62136214 self .assertEqual (SpecialAttrsP .__module__ , __name__ )
62146215 # Module-level ParamSpecs are picklable.
6215- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
6216- s = pickle .dumps (SpecialAttrsP , proto )
6217- loaded = pickle .loads (s )
6218- self .assertIs (SpecialAttrsP , loaded )
6216+ s = pickle .dumps (SpecialAttrsP , proto )
6217+ loaded = pickle .loads (s )
6218+ self .assertIs (SpecialAttrsP , loaded )
62196219
62206220 def test_genericalias_dir (self ):
62216221 class Foo (Generic [T ]):
0 commit comments