Skip to content

Better message for overloaded functions with required kwargs #16528

Open
@MarcinKonowalczyk

Description

@MarcinKonowalczyk

Feature

The following:

from typing import overload, Union

def fun(a: Union[int, str], *, b: bool) -> None:
    pass

fun(1, True)

says helpfully:

main.py:6: error: Too many positional arguments for "fun"  [misc]
Found 1 error in 1 file (checked 1 source file)

mypy-playground

In the following case however:

from typing import overload, Union

@overload
def fun(a: int, *, b: bool) -> None: ...

@overload
def fun(a: str, *, b: bool) -> None: ...

def fun(a: Union[int, str], *, b: bool) -> None:
    pass

fun(1, True)

we get:

main.py:12: error: No overload variant of "fun" matches argument types "int", "bool"  [call-overload]
main.py:12: note: Possible overload variants:
main.py:12: note:     def fun(a: int, *, b: bool) -> None
main.py:12: note:     def fun(a: str, *, b: bool) -> None
Found 1 error in 1 file (checked 1 source file)

mypy-playground

I think the error should also point out that the number of positional arguments is incorrect.

Pitch

I found myself confused by this a couple of times and have wasted good few hours trying to understand what's wrong with the call which is clearly correct, and just glancing straight past the * - something that's easy to do with a longer / more complicated function signature. I think it would save a meaningful amount of time for users and it feels like a simple change.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions