Skip to content

ParamspecArgs cannot be used with enumerate #12930

@kasium

Description

@kasium

Bug Report

With #12386 an issue was closed, that ParamSpec cannot be used as tuples and dicts. However, enumerate is seen as invalid, even if it works.

To Reproduce

from typing_extensions import ParamSpec
from typing import Callable, TypeVar

P = ParamSpec("P")
R = TypeVar("R")

def foo(func: Callable[P, R]) -> Callable[P, R]:
    def _inner(*args: P.args, **kwargs: P.kwargs) -> R:
        x = kwargs.pop("x")
        y = enumerate(args)
        return func(*args, **kwargs)
    return _inner

Expected Behavior

It works fine

Actual Behavior

foo.py:10:13: error: Need type annotation for "y"  [var-annotated]
            y = enumerate(args)
                ^
foo.py:10:23: error: Argument 1 to "enumerate" has incompatible type "P.args"; expected "Iterable[<nothing>]"  [arg-type]
            y = enumerate(args)
                          ^
Found 2 errors in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 0.960
  • Python version used: 3.7.2
  • Operating system and version: SUSE Linux

Activity

AlexWaygood

AlexWaygood commented on Jun 2, 2022

@AlexWaygood
Member

This looks like a bug to me, but here's a workaround in the meantime, that passes mypy:

from typing_extensions import ParamSpec
from typing import Callable, TypeVar

P = ParamSpec("P")
R = TypeVar("R")

def foo(func: Callable[P, R]) -> Callable[P, R]:
    def _inner(*args: P.args, **kwargs: P.kwargs) -> R:
        x = kwargs.pop("x")
        y: "enumerate[object]" = enumerate(args)
        return func(*args, **kwargs)
    return _inner
kasium

kasium commented on Jun 2, 2022

@kasium
Author

@AlexWaygood thanks!

AlexWaygood

AlexWaygood commented on Jun 4, 2022

@AlexWaygood
Member

Here's a repro that doesn't depend on the typeshed stubs for enumerate:

from typing_extensions import ParamSpec
from typing import Callable, TypeVar, Iterator, Iterable, Tuple

P = ParamSpec("P")
T = TypeVar("T")

def enumerate(x: Iterable[T]) -> Iterator[Tuple[int, T]]: ...

def foo(func: Callable[P, T]) -> Callable[P, T]:
    def _inner(*args: P.args, **kwargs: P.kwargs) -> T:
        x = kwargs.pop("x")
        y = enumerate(args)  # E: Need type annotation for "y"  # E: Argument 1 to "enumerate" has incompatible type "P.args"; expected "Iterable[<nothing>]"
        return func(*args, **kwargs)
    return _inner
added a commit that references this issue on Jun 4, 2022
8153e47
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-paramspecPEP 612, ParamSpec, Concatenate

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @kasium@AlexWaygood

      Issue actions

        ParamspecArgs cannot be used with enumerate · Issue #12930 · python/mypy