diff --git a/mypy/semanal_namedtuple.py b/mypy/semanal_namedtuple.py index cc8f9874bf59..111da9643586 100644 --- a/mypy/semanal_namedtuple.py +++ b/mypy/semanal_namedtuple.py @@ -149,6 +149,7 @@ def check_namedtuple_classdef( default_items: dict[str, Expression] = {} statements: list[Statement] = [] for stmt in defn.defs.body: + statements.append(stmt) if not isinstance(stmt, AssignmentStmt): # Still allow pass or ... (for empty namedtuples). if isinstance(stmt, PassStmt) or ( @@ -163,18 +164,17 @@ def check_namedtuple_classdef( continue # And nested classes, they need to be analyzed further: if isinstance(stmt, ClassDef): - statements.append(stmt) continue - + statements.pop() defn.removed_statements.append(stmt) self.fail(NAMEDTUP_CLASS_ERROR, stmt) elif len(stmt.lvalues) > 1 or not isinstance(stmt.lvalues[0], NameExpr): # An assignment, but an invalid one. + statements.pop() defn.removed_statements.append(stmt) self.fail(NAMEDTUP_CLASS_ERROR, stmt) else: # Append name and type in this case... - statements.append(stmt) name = stmt.lvalues[0].name items.append(name) if stmt.type is None: diff --git a/test-data/unit/check-class-namedtuple.test b/test-data/unit/check-class-namedtuple.test index b914bb3be515..a4e391f13729 100644 --- a/test-data/unit/check-class-namedtuple.test +++ b/test-data/unit/check-class-namedtuple.test @@ -390,12 +390,18 @@ class A(NamedTuple): class B(NamedTuple): x: str y: int = 1 + def method(self) -> int: ... # Correct: A(1) A.B('a') A.B('a', 2) +b: A.B +reveal_type(b.x) # N: Revealed type is "builtins.str" +reveal_type(b.y) # N: Revealed type is "builtins.int" +reveal_type(b.method()) # N: Revealed type is "builtins.int" + # Incorrect: A.B() # E: Missing positional argument "x" in call to "B" A.B(1, 'a') # E: Argument 1 to "B" has incompatible type "int"; expected "str" \