Skip to content

Concatenate implementation generates runtime exception if parameterized by ... #48

Closed

Description

@erictraut

The following code should work without a runtime exception.

from typing import Any, Callable
from typing_extensions import ParamSpec, Concatenate


P = ParamSpec("P")
MyAlias = Callable[Concatenate[int, P], Any]

x: MyAlias[...]

It runs fine on Python 3.10 if using typing.Concatenate but fails on Python 3.9 if using typing_extensions.Concatenate. The runtime exception is:

TypeError: Parameters to generic types must be types. Got Ellipsis.

Activity

  1. Fidget-Spinner commented on Jul 7, 2022

    @Fidget-Spinner
    Member

    This seems like a bug in Python's typing module itself.

    # In 3.9
    typing.Callable[T, int][...]
    
    TypeError: Parameters to generic types must be types. Got Ellipsis.

    The problem is that Callable uses the default _GenericAlias's substitution behavior pre 3.10. Which means its checks are too restrictive. We had to intentionally loosen the checks in 3.10 to get around this.

    I don't think we can fix this from typing_extensions unless we monkey patch typing._GenericAlias.__getitem__ (or typing._type_check). I don't feel too good doing that though.

  2. Fidget-Spinner commented on Jul 7, 2022

    @Fidget-Spinner
    Member

    Also, we're sadly past the stage for bugfixes in 3.9. I suggest that we add this to the known limitations in the README and (unfortunately) close as can't fix.

  3. JelleZijlstra commented on May 22, 2023

    @JelleZijlstra
    Member

    This is now documented as a limitation at https://typing-extensions.readthedocs.io/en/latest/#Concatenate. If there is a reasonable way to fix it, I'd accept a PR.

  4. Daraan commented on Oct 3, 2024

    @Daraan
    Contributor

    I am currently looking at this again and the statement that "It runs fine on Python 3.10 if using typing.Concatenate" confused be a bit.
    In hindsight this should only hold for 3.10.0-3.10.2 afterwards it also does not run on the other 3.10 typing versions either.

    Edit: Monkey patching copy_with of _ConcatenateGenericAlias to the 3.11 variant would be sufficient for the 3.10 versions.
    Edit2: Also doable without monkey patch in 3.10.

  5. Daraan commented on Oct 22, 2024

    @Daraan
    Contributor

    As a summary:

    #479 covered this Issue only for 3.10, or rather 3.10.3+.

    For 3.8 & 3.9 I see no other way around monkey patching typing._GenericAlias.__getitem__ to fix this issue.
    The essential part of the monkey patch could be similar to this, maybe with more checks on the origin:

    - params = tuple(_type_check(p, msg) for p in params)
    + params = tuple(typing._type_check(p, msg) if p is not ... else ...
    +                       for p in params)
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