Skip to content

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

Open
@intgr

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

added
bugmypy got something wrong
on Apr 5, 2022
erictraut

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

        Participants

        @intgr@erictraut@AlexWaygood

        Issue actions

          Positional-or-kw arg considered incompatible with positional-only argument · Issue #12525 · python/mypy