@@ -1492,13 +1492,33 @@ def visit_TryStar(self, node):
14921492 )
14931493
14941494 def visit_TypeVar (self , node ) -> j .TypeParameter :
1495- """Visit a TypeVar (e.g., T or T: int)."""
1495+ """Visit a TypeVar (e.g., T, T: int, T = int, or T: int = "default" )."""
14961496 prefix = self .__whitespace ()
14971497 name = self .__convert_name (node .name )
1498+ default = getattr (node , 'default_value' , None )
14981499 if node .bound :
1500+ if default :
1501+ bounds = JContainer (
1502+ self .__source_before (':' ),
1503+ [
1504+ self .__pad_right (self .__convert (node .bound ), self .__source_before ('=' )),
1505+ self .__pad_right (self .__convert (default ), Space .EMPTY ),
1506+ ],
1507+ Markers .EMPTY
1508+ )
1509+ else :
1510+ bounds = JContainer (
1511+ self .__source_before (':' ),
1512+ [self .__pad_right (self .__convert (node .bound ), Space .EMPTY )],
1513+ Markers .EMPTY
1514+ )
1515+ elif default :
14991516 bounds = JContainer (
1500- self .__source_before (':' ),
1501- [self .__pad_right (self .__convert (node .bound ), Space .EMPTY )],
1517+ self .__source_before ('=' ),
1518+ [
1519+ self .__pad_right (j .Empty (random_id (), Space .EMPTY , Markers .EMPTY ), Space .EMPTY ),
1520+ self .__pad_right (self .__convert (default ), Space .EMPTY ),
1521+ ],
15021522 Markers .EMPTY
15031523 )
15041524 else :
@@ -1514,7 +1534,7 @@ def visit_TypeVar(self, node) -> j.TypeParameter:
15141534 )
15151535
15161536 def visit_ParamSpec (self , node ) -> j .TypeParameter :
1517- """Visit a ParamSpec (e.g., **P)."""
1537+ """Visit a ParamSpec (e.g., **P or **P = [int, str] )."""
15181538 prefix = self .__whitespace ()
15191539 modifier = j .Modifier (
15201540 random_id (),
@@ -1525,18 +1545,30 @@ def visit_ParamSpec(self, node) -> j.TypeParameter:
15251545 []
15261546 )
15271547 name = self .__convert_name (node .name )
1548+ default = getattr (node , 'default_value' , None )
1549+ if default :
1550+ bounds = JContainer (
1551+ self .__source_before ('=' ),
1552+ [
1553+ self .__pad_right (j .Empty (random_id (), Space .EMPTY , Markers .EMPTY ), Space .EMPTY ),
1554+ self .__pad_right (self .__convert (default ), Space .EMPTY ),
1555+ ],
1556+ Markers .EMPTY
1557+ )
1558+ else :
1559+ bounds = None
15281560 return j .TypeParameter (
15291561 random_id (),
15301562 prefix ,
15311563 Markers .EMPTY ,
15321564 [], # annotations
15331565 [modifier ],
15341566 name ,
1535- None # no bounds
1567+ bounds
15361568 )
15371569
15381570 def visit_TypeVarTuple (self , node ) -> j .TypeParameter :
1539- """Visit a TypeVarTuple (e.g., *Ts)."""
1571+ """Visit a TypeVarTuple (e.g., *Ts or *Ts = *tuple[int, ...] )."""
15401572 prefix = self .__whitespace ()
15411573 modifier = j .Modifier (
15421574 random_id (),
@@ -1547,14 +1579,26 @@ def visit_TypeVarTuple(self, node) -> j.TypeParameter:
15471579 []
15481580 )
15491581 name = self .__convert_name (node .name )
1582+ default = getattr (node , 'default_value' , None )
1583+ if default :
1584+ bounds = JContainer (
1585+ self .__source_before ('=' ),
1586+ [
1587+ self .__pad_right (j .Empty (random_id (), Space .EMPTY , Markers .EMPTY ), Space .EMPTY ),
1588+ self .__pad_right (self .__convert (default ), Space .EMPTY ),
1589+ ],
1590+ Markers .EMPTY
1591+ )
1592+ else :
1593+ bounds = None
15501594 return j .TypeParameter (
15511595 random_id (),
15521596 prefix ,
15531597 Markers .EMPTY ,
15541598 [], # annotations
15551599 [modifier ],
15561600 name ,
1557- None # no bounds
1601+ bounds
15581602 )
15591603
15601604 def visit_TypeAlias (self , node ):
0 commit comments