Skip to content

Move error messages for keyword arguments with ParamSpec #21001

Open

Description

@A5rocks

Feature

At the moment, you need --extra-checks to catch this pedantic thing:

from typing import Concatenate, ParamSpec
from collections.abc import Callable

P = ParamSpec("P")

def f(a: Callable[P, None]) -> Callable[Concatenate[int, P], None]:
    def inner(x: int, *args: P.args, **kwargs: P.kwargs) -> None:  # proposal: warn here
        a(*args, **kwargs)
    
    return inner  # warns on this

Instead, @dhruvmanila came up with a different rule: warn on the definition of functions that have a keyword argument + ParamSpec *args/**kwargs. I think this is better, because we're trying to move away from flags which modify behavior strangely AFAIK. Then, regardless of error, we would treat x as positional-only.

Pitch

We would remove any custom subtyping (iirc, that's how --extra-checks works now), instead just replacing functions with a better version if it has *args: P.args, **kwargs: P.kwargs. Then we would have a disabled-by-default error code for this new check.

Activity

  1. changed the title [-]Move error messages for keyword arguments[/-] [+]Move error messages for keyword arguments with ParamSpec[/+] on Mar 10, 2026
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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions