Skip to content

Positional-or-kw arg considered incompatible with positional-only argument #12525

Open

Description

@intgr

Bug Report

from typing_extensions import Protocol


class Func(Protocol):
    def __call__(self, __a: int, **kwargs: str) -> None:
        #              ^^^ positional-only arg
        ...
    # Same error when using PEP 570 positional-only syntax:
    # def __call__(self, a: int, /, **kwargs: str) -> None:


def myfunc(a: int, **kwargs: str) -> None:
    pass


f: Func = myfunc

Expected Behavior

In my view this should be allowed. Anyone calling f() promises to pass the 1st argument as positional. And myfunc accepts the 1st argument as positional or kwarg, so it should be considered compatible.

Actual Behavior

Mypy output:

positional_only.py:12: error: Incompatible types in assignment (expression has type "Callable[[int, KwArg(str)], Any]", variable has type "Func")
positional_only.py:12: note: "Func.__call__" has type "Callable[[int, KwArg(str)], Any]"

Your Environment

  • Mypy version used: 0.942
  • Mypy command-line flags: (none)
  • Mypy configuration options from mypy.ini (and other config files): (none)
  • Python version used: 3.10.2
  • Operating system and version: macOS

Activity

  1. added
    bugmypy got something wrong
    on Apr 5, 2022
  2. erictraut commented on Apr 5, 2022

    @erictraut

    I agree this is a false positive. This should be allowed because there is no type safety violation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-callsFunction calls, *args, **kwargs, defaultstopic-protocols

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions