Skip to content

Commit 0f17104

Browse files
committed
Improve the __new__ error message to have a line number
1 parent 8e8f0d5 commit 0f17104

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

mypy/semanal_namedtuple.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def analyze_namedtuple_classdef(self, defn: ClassDef) -> Optional[TypeInfo]:
5151
node.kind = GDEF # TODO in process_namedtuple_definition also applies here
5252
items, types, default_items = self.check_namedtuple_classdef(defn)
5353
info = self.build_namedtuple_typeinfo(
54-
defn.name, items, types, default_items)
54+
defn.name, items, types, default_items, defn.line)
5555
node.node = info
5656
defn.info.replaced = info
5757
defn.info = info
@@ -160,7 +160,7 @@ def check_namedtuple(self,
160160
name = var_name
161161
else:
162162
name = 'namedtuple@' + str(call.line)
163-
info = self.build_namedtuple_typeinfo(name, [], [], {})
163+
info = self.build_namedtuple_typeinfo(name, [], [], {}, node.line)
164164
self.store_namedtuple_info(info, name, call, is_typed)
165165
return info
166166
name = cast(Union[StrExpr, BytesExpr, UnicodeExpr], call.args[0]).value
@@ -174,7 +174,7 @@ def check_namedtuple(self,
174174
}
175175
else:
176176
default_items = {}
177-
info = self.build_namedtuple_typeinfo(name, items, types, default_items)
177+
info = self.build_namedtuple_typeinfo(name, items, types, default_items, node.line)
178178
# Store it as a global just in case it would remain anonymous.
179179
# (Or in the nearest class if there is one.)
180180
self.store_namedtuple_info(info, name, call, is_typed)
@@ -290,7 +290,8 @@ def fail_namedtuple_arg(self, message: str, context: Context
290290
return [], [], [], False
291291

292292
def build_namedtuple_typeinfo(self, name: str, items: List[str], types: List[Type],
293-
default_items: Mapping[str, Expression]) -> TypeInfo:
293+
default_items: Mapping[str, Expression],
294+
line: int) -> TypeInfo:
294295
strtype = self.api.named_type('__builtins__.str')
295296
implicit_any = AnyType(TypeOfAny.special_form)
296297
basetuple_type = self.api.named_type('__builtins__.tuple', [implicit_any])
@@ -363,6 +364,7 @@ def add_method(funcname: str,
363364
function_type)
364365
signature.variables = [tvd]
365366
func = FuncDef(funcname, args, Block([]))
367+
func.line = line
366368
func.info = info
367369
func.is_class = is_classmethod
368370
func.type = set_callable_name(signature, func)

test-data/unit/check-class-namedtuple.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ class XMethBad(NamedTuple):
587587
class MagicalFields(NamedTuple):
588588
x: int
589589
def __slots__(self) -> None: pass # E: Cannot overwrite NamedTuple attribute "__slots__"
590-
def __new__(cls) -> None: pass # E: Name '__new__' already defined (possibly by an import)
590+
def __new__(cls) -> None: pass # E: Name '__new__' already defined on line 8
591591
def _source(self) -> int: pass # E: Cannot overwrite NamedTuple attribute "_source"
592592
__annotations__ = {'x': float} # E: NamedTuple field name cannot start with an underscore: __annotations__ \
593593
# E: Invalid statement in NamedTuple definition; expected "field_name: field_type [= default]" \

0 commit comments

Comments
 (0)