Skip to content

Commit 82bc8df

Browse files
authored
stubgen: Use _typeshed.Incomplete instead of typing.Any (#12449)
Since python/typeshed#7535, typeshed has a new type `_typeshed.Incomplete`, intended to mark fields that are partly annotated, but need more manual investigation. This applies to all types generated by stubgen, except when explicitly annotated with `Any` in the implementation.
1 parent 6b0e848 commit 82bc8df

File tree

2 files changed

+100
-89
lines changed

2 files changed

+100
-89
lines changed

mypy/stubgen.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ def visit_mypy_file(self, o: MypyFile) -> None:
566566
self.defined_names = find_defined_names(o)
567567
self.referenced_names = find_referenced_names(o)
568568
known_imports = {
569+
"_typeshed": ["Incomplete"],
569570
"typing": ["Any", "TypeVar"],
570571
"collections.abc": ["Generator"],
571572
}
@@ -689,14 +690,14 @@ def visit_func_def(self, o: FuncDef, is_abstract: bool = False,
689690
return_name = 'None'
690691
for expr, in_assignment in all_yield_expressions(o):
691692
if expr.expr is not None and not self.is_none_expr(expr.expr):
692-
self.add_typing_import('Any')
693-
yield_name = 'Any'
693+
self.add_typing_import('Incomplete')
694+
yield_name = 'Incomplete'
694695
if in_assignment:
695-
self.add_typing_import('Any')
696-
send_name = 'Any'
696+
self.add_typing_import('Incomplete')
697+
send_name = 'Incomplete'
697698
if has_return_statement(o):
698-
self.add_typing_import('Any')
699-
return_name = 'Any'
699+
self.add_typing_import('Incomplete')
700+
return_name = 'Incomplete'
700701
generator_name = self.typing_name('Generator')
701702
retname = f'{generator_name}[{yield_name}, {send_name}, {return_name}]'
702703
elif not has_return_statement(o) and not is_abstract:
@@ -954,18 +955,18 @@ def process_namedtuple(self, lvalue: NameExpr, rvalue: CallExpr) -> None:
954955
list_items = cast(List[StrExpr], rvalue.args[1].items)
955956
items = [item.value for item in list_items]
956957
else:
957-
self.add('%s%s: Any' % (self._indent, lvalue.name))
958-
self.import_tracker.require_name('Any')
958+
self.add('%s%s: Incomplete' % (self._indent, lvalue.name))
959+
self.import_tracker.require_name('Incomplete')
959960
return
960961
self.import_tracker.require_name('NamedTuple')
961962
self.add('{}class {}(NamedTuple):'.format(self._indent, lvalue.name))
962963
if len(items) == 0:
963964
self.add(' ...\n')
964965
else:
965-
self.import_tracker.require_name('Any')
966+
self.import_tracker.require_name('Incomplete')
966967
self.add('\n')
967968
for item in items:
968-
self.add('{} {}: Any\n'.format(self._indent, item))
969+
self.add('{} {}: Incomplete\n'.format(self._indent, item))
969970
self._state = CLASS
970971

971972
def is_alias_expression(self, expr: Expression, top_level: bool = True) -> bool:
@@ -1220,11 +1221,11 @@ def get_str_type_of_node(self, rvalue: Expression,
12201221
return 'bool'
12211222
if can_infer_optional and \
12221223
isinstance(rvalue, NameExpr) and rvalue.name == 'None':
1223-
self.add_typing_import('Any')
1224-
return '{} | None'.format(self.typing_name('Any'))
1224+
self.add_typing_import('Incomplete')
1225+
return '{} | None'.format(self.typing_name('Incomplete'))
12251226
if can_be_any:
1226-
self.add_typing_import('Any')
1227-
return self.typing_name('Any')
1227+
self.add_typing_import('Incomplete')
1228+
return self.typing_name('Incomplete')
12281229
else:
12291230
return ''
12301231

0 commit comments

Comments
 (0)