Skip to content

Commit 05f878d

Browse files
ilevkivskyimsullivan
authored andcommitted
Fix and store fallbacks for incomplete namedtuples (#5429)
1 parent f637215 commit 05f878d

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

mypy/semanal_namedtuple.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,13 @@ def check_namedtuple(self,
151151
items, types, defaults, ok = self.parse_namedtuple_args(call, fullname)
152152
if not ok:
153153
# Error. Construct dummy return value.
154-
return self.build_namedtuple_typeinfo('namedtuple', [], [], {})
154+
if var_name:
155+
name = var_name
156+
else:
157+
name = 'namedtuple@' + str(call.line)
158+
info = self.build_namedtuple_typeinfo(name, [], [], {})
159+
self.store_namedtuple_info(info, name, call, is_typed)
160+
return info
155161
name = cast(StrExpr, call.args[0]).value
156162
if name != var_name or is_func_scope:
157163
# Give it a unique name derived from the line number.
@@ -166,11 +172,15 @@ def check_namedtuple(self,
166172
info = self.build_namedtuple_typeinfo(name, items, types, default_items)
167173
# Store it as a global just in case it would remain anonymous.
168174
# (Or in the nearest class if there is one.)
175+
self.store_namedtuple_info(info, name, call, is_typed)
176+
return info
177+
178+
def store_namedtuple_info(self, info: TypeInfo, name: str,
179+
call: CallExpr, is_typed: bool) -> None:
169180
stnode = SymbolTableNode(GDEF, info)
170181
self.api.add_symbol_table_node(name, stnode)
171182
call.analyzed = NamedTupleExpr(info, is_typed=is_typed)
172183
call.analyzed.set_line(call.line, call.column)
173-
return info
174184

175185
def parse_namedtuple_args(self, call: CallExpr, fullname: str
176186
) -> Tuple[List[str], List[Type], List[Expression], bool]:

test-data/unit/fine-grained.test

+20
Original file line numberDiff line numberDiff line change
@@ -7260,6 +7260,26 @@ x = [] # type: List
72607260
[out]
72617261
==
72627262

7263+
[case testNamedTupleFallbackModule]
7264+
import b
7265+
[file b.py]
7266+
from a import A
7267+
def f(a: A):
7268+
pass
7269+
[file b.py.2]
7270+
from a import A
7271+
def f(a: A):
7272+
reveal_type(a)
7273+
[file a.py]
7274+
from typing import NamedTuple
7275+
7276+
F = [('x', int)]
7277+
A = NamedTuple('A', F) # type: ignore
7278+
[builtins fixtures/list.pyi]
7279+
[out]
7280+
==
7281+
b.py:3: error: Revealed type is 'Tuple[, fallback=a.A]'
7282+
72637283
[case testImportOnTopOfAlias1]
72647284
from a import A
72657285
x: A

0 commit comments

Comments
 (0)