@@ -6402,6 +6402,34 @@ def test_typevartuple(self):
64026402 class A (Generic [Unpack [Ts ]]): ...
64036403 Alias = Optional [Unpack [Ts ]]
64046404
6405+ @skipIf (
6406+ sys .version_info < (3 , 11 , 1 ),
6407+ "Not yet backported for older versions of Python"
6408+ )
6409+ def test_typevartuple_specialization (self ):
6410+ T = TypeVar ("T" )
6411+ Ts = TypeVarTuple ('Ts' , default = Unpack [Tuple [str , int ]])
6412+ self .assertEqual (Ts .__default__ , Unpack [Tuple [str , int ]])
6413+ class A (Generic [T , Unpack [Ts ]]): ...
6414+ self .assertEqual (A [float ].__args__ , (float , str , int ))
6415+ self .assertEqual (A [float , range ].__args__ , (float , range ))
6416+ self .assertEqual (A [float , Unpack [tuple [int , ...]]].__args__ , (float , Unpack [tuple [int , ...]]))
6417+
6418+ @skipIf (
6419+ sys .version_info < (3 , 11 , 1 ),
6420+ "Not yet backported for older versions of Python"
6421+ )
6422+ def test_typevar_and_typevartuple_specialization (self ):
6423+ T = TypeVar ("T" )
6424+ U = TypeVar ("U" , default = float )
6425+ Ts = TypeVarTuple ('Ts' , default = Unpack [Tuple [str , int ]])
6426+ self .assertEqual (Ts .__default__ , Unpack [Tuple [str , int ]])
6427+ class A (Generic [T , U , Unpack [Ts ]]): ...
6428+ self .assertEqual (A [int ].__args__ , (int , float , str , int ))
6429+ self .assertEqual (A [int , str ].__args__ , (int , str , str , int ))
6430+ self .assertEqual (A [int , str , range ].__args__ , (int , str , range ))
6431+ self .assertEqual (A [int , str , Unpack [tuple [int , ...]]].__args__ , (int , str , Unpack [tuple [int , ...]]))
6432+
64056433 def test_no_default_after_typevar_tuple (self ):
64066434 T = TypeVar ("T" , default = int )
64076435 Ts = TypeVarTuple ("Ts" )
@@ -6487,6 +6515,46 @@ def test_allow_default_after_non_default_in_alias(self):
64876515 a4 = Callable [[Unpack [Ts ]], T ]
64886516 self .assertEqual (a4 .__args__ , (Unpack [Ts ], T ))
64896517
6518+ @skipIf (
6519+ sys .version_info < (3 , 11 , 1 ),
6520+ "Not yet backported for older versions of Python"
6521+ )
6522+ def test_paramspec_specialization (self ):
6523+ T = TypeVar ("T" )
6524+ P = ParamSpec ('P' , default = [str , int ])
6525+ self .assertEqual (P .__default__ , [str , int ])
6526+ class A (Generic [T , P ]): ...
6527+ self .assertEqual (A [float ].__args__ , (float , (str , int )))
6528+ self .assertEqual (A [float , [range ]].__args__ , (float , (range ,)))
6529+
6530+ @skipIf (
6531+ sys .version_info < (3 , 11 , 1 ),
6532+ "Not yet backported for older versions of Python"
6533+ )
6534+ def test_typevar_and_paramspec_specialization (self ):
6535+ T = TypeVar ("T" )
6536+ U = TypeVar ("U" , default = float )
6537+ P = ParamSpec ('P' , default = [str , int ])
6538+ self .assertEqual (P .__default__ , [str , int ])
6539+ class A (Generic [T , U , P ]): ...
6540+ self .assertEqual (A [float ].__args__ , (float , float , (str , int )))
6541+ self .assertEqual (A [float , int ].__args__ , (float , int , (str , int )))
6542+ self .assertEqual (A [float , int , [range ]].__args__ , (float , int , (range ,)))
6543+
6544+ @skipIf (
6545+ sys .version_info < (3 , 11 , 1 ),
6546+ "Not yet backported for older versions of Python"
6547+ )
6548+ def test_paramspec_and_typevar_specialization (self ):
6549+ T = TypeVar ("T" )
6550+ P = ParamSpec ('P' , default = [str , int ])
6551+ U = TypeVar ("U" , default = float )
6552+ self .assertEqual (P .__default__ , [str , int ])
6553+ class A (Generic [T , P , U ]): ...
6554+ self .assertEqual (A [float ].__args__ , (float , (str , int ), float ))
6555+ self .assertEqual (A [float , [range ]].__args__ , (float , (range ,), float ))
6556+ self .assertEqual (A [float , [range ], int ].__args__ , (float , (range ,), int ))
6557+
64906558
64916559class NoDefaultTests (BaseTestCase ):
64926560 @skip_if_py313_beta_1
0 commit comments