@@ -1235,15 +1235,15 @@ def test_weakref(self):
1235
1235
alias = Callable [[int , str ], float ]
1236
1236
self .assertEqual (weakref .ref (alias )(), alias )
1237
1237
1238
- def test_pickle (self ):
1238
+ @all_pickle_protocols
1239
+ def test_pickle (self , proto ):
1239
1240
Callable = self .Callable
1240
1241
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__ )
1247
1247
1248
1248
def test_var_substitution (self ):
1249
1249
Callable = self .Callable
@@ -2218,7 +2218,8 @@ class P(Protocol):
2218
2218
Alias2 = typing .Union [P , typing .Iterable ]
2219
2219
self .assertEqual (Alias , Alias2 )
2220
2220
2221
- def test_protocols_pickleable (self ):
2221
+ @all_pickle_protocols
2222
+ def test_protocols_pickleable (self , proto ):
2222
2223
global P , CP # pickle wants to reference the class by name
2223
2224
T = TypeVar ('T' )
2224
2225
@@ -2232,20 +2233,20 @@ class CP(P[int]):
2232
2233
c = CP ()
2233
2234
c .foo = 42
2234
2235
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 )
2244
2236
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 )
2247
2245
2248
- self
1E0A
span>.assertIsInstance (E (), D )
2246
+ class E :
2247
+ x = 1
2248
+
2249
+ self .assertIsInstance (E (), D )
2249
2250
2250
2251
def test_supports_int (self ):
2251
2252
self .assertIsSubclass (int , typing .SupportsInt )
@@ -2844,7 +2845,8 @@ def test_all_repr_eq_any(self):
2844
2845
self .assertNotEqual (repr (base ), '' )
2845
2846
self .assertEqual (base , base )
2846
2847
2847
- def test_pickle (self ):
2848
+ @all_pickle_protocols
2849
+ def test_pickle (self , proto ):
2848
2850
global C # pickle wants to reference the class by name
2849
2851
T = TypeVar ('T' )
2850
2852
@@ -2857,27 +2859,26 @@ class C(B[int]):
2857
2859
c = C ()
2858
2860
c .foo = 42
2859
2861
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
+
2866
2869
samples = [Any , Union , Tuple , Callable , ClassVar ,
2867
2870
Union [int , str ], ClassVar [List ], Tuple [int , ...], Callable [[str ], bytes ],
2868
2871
typing .DefaultDict , typing .FrozenSet [int ]]
2869
2872
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 )
2874
2876
more_samples = [List , typing .Iterable , typing .Type , List [int ],
2875
2877
typing .Type [typing .Mapping ], typing .AbstractSet [Tuple [int , str ]]]
2876
2878
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 )
2881
2882
2882
2883
def test_copy_and_deepcopy (self ):
2883
2884
T = TypeVar ('T' )
@@ -2891,7 +2892,8 @@ class Node(Generic[T]): ...
2891
2892
self .assertEqual (t , copy (t ))
2892
2893
self .assertEqual (t , deepcopy (t ))
2893
2894
2894
- def test_immutability_by_copy_and_pickle (self ):
2895
+ @all_pickle_protocols
2896
+ def test_immutability_by_copy_and_pickle (self , proto ):
2895
2897
# Special forms like Union, Any, etc., generic aliases to containers like List,
2896
2898
# Mapping, etc., and type variabcles are considered immutable by copy and pickle.
2897
2899
global TP , TPB , TPV , PP # for pickle
@@ -2905,8 +2907,7 @@ def test_immutability_by_copy_and_pickle(self):
2905
2907
with self .subTest (thing = X ):
2906
2908
self .assertIs (copy (X ), X )
2907
2909
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 )
2910
2911
del TP , TPB , TPV , PP
2911
2912
2912
2913
# Check that local type variables are copyable.
@@ -4977,20 +4978,20 @@ def test_repr(self):
4977
4978
self .assertEqual (repr (self .UserName ),
4978
4979
f'{ __name__ } .{ self .__class__ .__qualname__ } .UserName' )
4979
4980
4980
- def test_pickle (self ):
4981
+ @all_pickle_protocols
4982
+ def test_pickle (self , proto ):
4981
4983
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 )
4987
4984
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 )
4991
4992
4992
- with self .assertRaises (pickle .PicklingError ):
4993
- pickle .dumps (UserAge , proto )
4993
+ with self .assertRaises (pickle .PicklingError ):
4994
+ pickle .dumps (UserAge , proto )
4994
4995
4995
4996
def test_missing__name__ (self ):
4996
4997
code = ("import typing\n "
@@ -5142,17 +5143,18 @@ def test_namedtuple_errors(self):
5142
5143
with self .assertRaises (TypeError ):
5143
5144
NamedTuple (typename = 'Emp' , name = str , id = int )
5144
5145
5145
- def test_copy_and_pickle (self ):
5146
+ @all_pickle_protocols
5147
+ def test_copy_and_pickle (self , proto ):
5146
5148
global Emp # pickle wants to reference the class by name
5147
5149
Emp = NamedTuple ('Emp' , [('name' , str ), ('cool' , int )])
5148
5150
for cls in Emp , CoolEmployee , self .NestedEmployee :
5149
5151
with self .subTest (cls = cls ):
5150
5152
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 )
5156
5158
5157
5159
jane2 = copy (jane )
5158
5160
self .assertEqual (jane2 , jane )
@@ -5244,18 +5246,19 @@ def test_py36_class_syntax_usage(self):
5244
5246
other = LabelPoint2D (x = 0 , y = 1 , label = 'hi' )
5245
5247
self .assertEqual (other ['label' ], 'hi' )
5246
5248
5247
- def test_pickle (self ):
5249
+ @all_pickle_protocols
5250
+ def test_pickle (self , proto ):
5248
5251
global EmpD # pickle wants to reference the class by name
5249
5252
EmpD = TypedDict ('EmpD' , {'name' : str , 'id' : int })
5250
5253
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 )
5259
5262
5260
5263
def test_optional (self ):
5261
5264
EmpD = TypedDict ('EmpD' , {'name' : str , 'id' : int })
@@ -5645,19 +5648,19 @@ def test_too_few_type_args(self):
5645
5648
with self .assertRaisesRegex (TypeError , 'at least two arguments' ):
5646
5649
Annotated [int ]
5647
5650
5648
- def test_pickle (self ):
5651
+ @all_pickle_protocols
5652
+ def test_pickle (self , proto ):
5649
5653
samples = [typing .Any , typing .Union [int , str ],
5650
5654
typing .Optional [str ], Tuple [int , ...],
5651
5655
typing .Callable [[str ], bytes ]]
5652
5656
5653
5657
for t in samples :
5654
5658
x = Annotated [t , "a" ]
5655
5659
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 )
5661
5664
5662
5665
global _Annotated_test_G
5663
5666
@@ -5668,12 +5671,11 @@ class _Annotated_test_G(Generic[T]):
5668
5671
G .foo = 42
5669
5672
G .bar = 'abc'
5670
5673
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 )
5677
5679
5678
5680
def test_subst (self ):
5679
5681
dec = "a decoration"
@@ -6040,7 +6042,8 @@ def test_no_isinstance(self):
6040
6042
6041
6043
class SpecialAttrsTests (BaseTestCase ):
6042
6044
6043
- def test_special_attrs (self ):
6045
+ @all_pickle_protocols
6046
+ def test_special_attrs (self , proto ):
6044
6047
cls_to_check = {
6045
6048
# ABC classes
6046
6049
typing .AbstractSet : 'AbstractSet' ,
@@ -6160,14 +6163,15 @@ def test_special_attrs(self):
6160
6163
self .assertEqual (cls .__name__ , name , str (cls ))
6161
6164
self .assertEqual (cls .__qualname__ , name , str (cls ))
6162
6165
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 )
6167
6170
6168
6171
TypeName = typing .NewType ('SpecialAttrsTests.TypeName' , Any )
6169
6172
6170
- def test_special_attrs2 (self ):
6173
+ @all_pickle_protocols
6174
+ def test_special_attrs2 (self , proto ):
6171
6175
# Forward refs provide a different introspection API. __name__ and
6172
6176
# __qualname__ make little sense for forward refs as they can store
6173
6177
# complex typing expressions.
@@ -6176,9 +6180,8 @@ def test_special_attrs2(self):
6176
6180
self .assertFalse (hasattr (fr , '__qualname__' ))
6177
6181
self .assertEqual (fr .__module__ , 'typing' )
6178
6182
# 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 )
6182
6185
6183
6186
self .assertEqual (SpecialAttrsTests .TypeName .__name__ , 'TypeName' )
6184
6187
self .assertEqual (
@@ -6190,10 +6193,9 @@ def test_special_attrs2(self):
6190
6193
__name__ ,
6191
6194
)
6192
6195
# 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 )
6197
6199
6198
6200
# Type variables don't support non-global instantiation per PEP 484
6199
6201
# restriction that "The argument to TypeVar() must be a string equal
@@ -6203,19 +6205,17 @@ def test_special_attrs2(self):
6203
6205
self .assertFalse (hasattr (SpecialAttrsT , '__qualname__' ))
6204
6206
self .assertEqual (SpecialAttrsT .__module__ , __name__ )
6205
6207
# 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 )
6210
6211
6211
6212
self .assertEqual (SpecialAttrsP .__name__ , 'SpecialAttrsP' )
6212
6213
self .assertFalse (hasattr (SpecialAttrsP , '__qualname__' ))
6213
6214
self .assertEqual (SpecialAttrsP .__module__ , __name__ )
6214
6215
# 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 )
6219
6219
6220
6220
def test_genericalias_dir (self ):
6221
6221
class Foo (Generic [T ]):
0 commit comments