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