diff --git a/mypy/messages.py b/mypy/messages.py index 59b1b3db07cc..9540828012b0 100644 --- a/mypy/messages.py +++ b/mypy/messages.py @@ -941,6 +941,7 @@ def too_few_arguments( def missing_named_argument(self, callee: CallableType, context: Context, name: str) -> None: msg = f'Missing named argument "{name}"' + for_function(callee) self.fail(msg, context, code=codes.CALL_ARG) + self.note_defined_here(callee, context) def too_many_arguments(self, callee: CallableType, context: Context) -> None: if self.prefer_simple_messages(): @@ -1011,6 +1012,9 @@ def unexpected_keyword_argument( self.unexpected_keyword_argument_for_function( for_function(callee), name, context, matches=matches ) + self.note_defined_here(callee, context) + + def note_defined_here(self, callee: CallableType, context: Context) -> None: module = find_defining_module(self.modules, callee) if ( module diff --git a/test-data/unit/check-kwargs.test b/test-data/unit/check-kwargs.test index a0dc2c2686b7..c8653143bd9d 100644 --- a/test-data/unit/check-kwargs.test +++ b/test-data/unit/check-kwargs.test @@ -480,6 +480,24 @@ tmp/m.py:1: error: Unsupported operand types for + ("int" and "str") main:2: error: Unexpected keyword argument "x" for "A" main:2: note: "A" defined in "m" +[case testMissingNamedArgumentFromOtherModule] +import m +m.f(1) +m.f(a=1) +[file m.py] +def f(a: int, *, b: str) -> None: + pass +[out] +main:2: error: Missing named argument "b" for "f" +main:2: note: "f" defined in "m" +main:3: error: Missing named argument "b" for "f" +main:3: note: "f" defined in "m" + +[case testMissingNamedArgumentForSameModule] +def f(a: int, *, b: str) -> None: + pass +f(1) # E: Missing named argument "b" for "f" + [case testStarArgsAndKwArgsSpecialCase] from typing import Dict, Mapping