@@ -516,21 +516,20 @@ def _get_func_return(self, o: FuncDef, ctx: FunctionContext) -> str | None:
516
516
if retname is not None :
517
517
return retname
518
518
if has_yield_expression (o ) or has_yield_from_expression (o ):
519
- self .add_typing_import ("Generator" )
520
519
yield_name = "None"
521
520
send_name = "None"
522
521
return_name = "None"
523
522
if has_yield_from_expression (o ):
524
- yield_name = send_name = self .add_incomplete ( )
523
+ yield_name = send_name = self .add_name ( "_typeshed.Incomplete" )
525
524
else :
526
525
for expr , in_assignment in all_yield_expressions (o ):
527
526
if expr .expr is not None and not is_none_expr (expr .expr ):
528
- yield_name = self .add_incomplete ( )
527
+ yield_name = self .add_name ( "_typeshed.Incomplete" )
529
528
if in_assignment :
530
- send_name = self .add_incomplete ( )
529
+ send_name = self .add_name ( "_typeshed.Incomplete" )
531
530
if has_return_statement (o ):
532
- return_name = self .add_incomplete ( )
533
- generator_name = self .add_typing_import ( " Generator" )
531
+ return_name = self .add_name ( "_typeshed.Incomplete" )
532
+ generator_name = self .add_name ( "collections.abc. Generator" )
534
533
return f"{ generator_name } [{ yield_name } , { send_name } , { return_name } ]"
535
534
if not has_return_statement (o ) and o .abstract_status == NOT_ABSTRACT :
536
535
return "None"
@@ -731,18 +730,17 @@ def get_base_types(self, cdef: ClassDef) -> list[str]:
731
730
typename = base .args [0 ].value
732
731
if nt_fields is not None :
733
732
fields_str = ", " .join (f"({ f !r} , { t } )" for f , t in nt_fields )
734
- namedtuple_name = self .add_typing_import ( " NamedTuple" )
733
+ namedtuple_name = self .add_name ( "typing. NamedTuple" )
735
734
base_types .append (f"{ namedtuple_name } ({ typename !r} , [{ fields_str } ])" )
736
- self .add_typing_import ("NamedTuple" )
737
735
else :
738
736
# Invalid namedtuple() call, cannot determine fields
739
- base_types .append (self .add_incomplete ( ))
737
+ base_types .append (self .add_name ( "_typeshed.Incomplete" ))
740
738
elif self .is_typed_namedtuple (base ):
741
739
base_types .append (base .accept (p ))
742
740
else :
743
741
# At this point, we don't know what the base class is, so we
744
742
# just use Incomplete as the base class.
745
- base_types .append (self .add_incomplete ( ))
743
+ base_types .append (self .add_name ( "_typeshed.Incomplete" ))
746
744
for name , value in cdef .keywords .items ():
747
745
if name == "metaclass" :
748
746
continue # handled separately
@@ -823,7 +821,7 @@ def _get_namedtuple_fields(self, call: CallExpr) -> list[tuple[str, str]] | None
823
821
else :
824
822
return None # Invalid namedtuple fields type
825
823
if field_names :
826
- incomplete = self .add_incomplete ( )
824
+ incomplete = self .add_name ( "_typeshed.Incomplete" )
827
825
return [(field_name , incomplete ) for field_name in field_names ]
828
826
else :
829
827
return []
@@ -857,7 +855,7 @@ def process_namedtuple(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
857
855
if fields is None :
858
856
self .annotate_as_incomplete (lvalue )
859
857
return
860
- bases = self .add_typing_import ( " NamedTuple" )
858
+ bases = self .add_name ( "typing. NamedTuple" )
861
859
# TODO: Add support for generic NamedTuples. Requires `Generic` as base class.
862
860
class_def = f"{ self ._indent } class { lvalue .name } ({ bases } ):"
863
861
if len (fields ) == 0 :
@@ -907,14 +905,13 @@ def process_typeddict(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
907
905
total = arg
908
906
else :
909
907
items .append ((arg_name , arg ))
910
- self .add_typing_import ("TypedDict" )
911
908
p = AliasPrinter (self )
912
909
if any (not key .isidentifier () or keyword .iskeyword (key ) for key , _ in items ):
913
910
# Keep the call syntax if there are non-identifier or reserved keyword keys.
914
911
self .add (f"{ self ._indent } { lvalue .name } = { rvalue .accept (p )} \n " )
915
912
self ._state = VAR
916
913
else :
917
- bases = self .add_typing_import ( " TypedDict" )
914
+ bases = self .add_name ( "typing_extensions. TypedDict" )
918
915
# TODO: Add support for generic TypedDicts. Requires `Generic` as base class.
919
916
if total is not None :
920
917
bases += f", total={ total .accept (p )} "
@@ -931,7 +928,7 @@ def process_typeddict(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
931
928
self ._state = CLASS
932
929
933
930
def annotate_as_incomplete (self , lvalue : NameExpr ) -> None :
934
- incomplete = self .add_incomplete ( )
931
+ incomplete = self .add_name ( "_typeshed.Incomplete" )
935
932
self .add (f"{ self ._indent } { lvalue .name } : { incomplete } \n " )
936
933
self ._state = VAR
937
934
@@ -1134,10 +1131,10 @@ def get_str_type_of_node(
1134
1131
if isinstance (rvalue , NameExpr ) and rvalue .name in ("True" , "False" ):
1135
1132
return "bool"
1136
1133
if can_infer_optional and isinstance (rvalue , NameExpr ) and rvalue .name == "None" :
1137
- incomplete = self .add_incomplete ( )
1134
+ incomplete = self .add_name ( "_typeshed.Incomplete" )
1138
1135
return f"{ incomplete } | None"
1139
1136
if can_be_any :
1140
- return self .add_incomplete ( )
1137
+ return self .add_name ( "_typeshed.Incomplete" )
1141
1138
else :
1142
1139
return ""
1143
1140
0 commit comments