@@ -1916,14 +1916,29 @@ def test_weakref(self):
1916
1916
self .assertEqual (weakref .ref (alias )(), alias )
1917
1917
1918
1918
def test_pickle (self ):
1919
+ global T_pickle , P_pickle , TS_pickle # needed for pickling
1919
1920
Callable = self .Callable
1920
- alias = Callable [[int , str ], float ]
1921
- for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
1922
- s = pickle .dumps (alias , proto )
1923
- loaded = pickle .loads (s )
1924
- self .assertEqual (alias .__origin__ , loaded .__origin__ )
1925
- self .assertEqual (alias .__args__ , loaded .__args__ )
1926
- self .assertEqual (alias .__parameters__ , loaded .__parameters__ )
1921
+ T_pickle = TypeVar ('T_pickle' )
1922
+ P_pickle = ParamSpec ('P_pickle' )
1923
+ TS_pickle = TypeVarTuple ('TS_pickle' )
1924
+
1925
+ samples = [
1926
+ Callable [[int , str ], float ],
1927
+ Callable [P_pickle , int ],
1928
+ Callable [P_pickle , T_pickle ],
1929
+ Callable [Concatenate [int , P_pickle ], int ],
1930
+ Callable [Concatenate [* TS_pickle , P_pickle ], int ],
1931
+ ]
1932
+ for alias in samples :
1933
+ for proto in range (pickle .HIGHEST_PROTOCOL + 1 ):
1934
+ with self .subTest (alias = alias , proto = proto ):
1935
+ s = pickle .dumps (alias , proto )
1936
+ loaded = pickle .loads (s )
1937
+ self .assertEqual (alias .__origin__ , loaded .__origin__ )
1938
+ self .assertEqual (alias .__args__ , loaded .__args__ )
1939
+ self .assertEqual (alias .__parameters__ , loaded .__parameters__ )
1940
+
1941
+ del T_pickle , P_pickle , TS_pickle # cleaning up global state
1927
1942
1928
1943
def test_var_substitution (self ):
1929
1944
Callable = self .Callable
@@ -1949,6 +1964,16 @@ def test_var_substitution(self):
1949
1964
self .assertEqual (C5 [int , str , float ],
1950
1965
Callable [[typing .List [int ], tuple [str , int ], float ], int ])
1951
1966
1967
+ def test_type_subst_error (self ):
1968
+ Callable = self .Callable
1969
+ P = ParamSpec ('P' )
1970
+ T = TypeVar ('T' )
1971
+
1972
+ pat = "Expected a list of types, an ellipsis, ParamSpec, or Concatenate."
1973
+
1974
+ with self .assertRaisesRegex (TypeError , pat ):
1975
+ Callable [P , T ][0 , int ]
1976
+
1952
1977
def test_type_erasure (self ):
1953
1978
Callable = self .Callable
1954
1979
class C1 (Callable ):
0 commit comments