python / python/mypy

`mypy` doesn't understand that `*args: P.args` implies that `args` is a `tuple`

Abierto
#19,663 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug topic-calls topic-paramspec
Lenguaje dominante
Python
Estrellas
20.6k
Forks
3.3k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

from typing import Callable

def as_tuple[*Ts](*args: *Ts) -> tuple[*Ts]: return args
def tuple_identity[*Ts](t: tuple[*Ts]) -> tuple[*Ts]: return t
def tuple_identity2[T: tuple](t: T) -> T: return t


def test_paramspec[**P](
    dummy: Callable[P, None],  # ensure P is bound
    /,
    *args: P.args,
    **kwargs: P.kwargs,
) -> None:
    reveal_type(args)                   # N: "P.args`-1" 
    reveal_type( (*args,) )             # N: "builtins.tuple[P.args`-1, ...]"
    reveal_type( tuple(args) )          # N: "builtins.tuple[builtins.object, ...]"
    reveal_type(as_tuple(*args))        # N: "builtins.tuple[P.args`-1, ...]"
    reveal_type(tuple_identity(args))   # N: "builtins.tuple[Never, ...]"
                                        # E: [arg-type]
    reveal_type(tuple_identity2(args))  # N: "P.args`-1" ✅

    if isinstance(args, tuple):
        pass
    else:
        reveal_type(args)  # false negative [warn-unreachable]

https://mypy-play.net/?mypy=latest&python=3.12&flags=warn-unreachable&gist=3eabd8f4ee599e272934c94080f02bd8

Ideally, all the reveal_types should show the same result (or raise errors if considered misuse of ParamSpec[^1]), and the else-branch should trigger an unreachable warning.

[^1]: For instance, pyright says as_tuple(*args) is illegal. Code sample in pyright playground

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el reproductor test_params proporcionado y ejecútalo con warn-unreachable habilitado, comparando los resultados de reveal_type de mypy con el comportamiento esperado y los playgrounds enlazados. Rastrea el tratamiento de los argumentos de ParamSpec y el estrechamiento de tuplas en mypy; se considera terminado cuando los tipos revelados son coherentes o se rechazan correctamente, y la rama else imposible informa de que es inalcanzable.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
devtools
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
42/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.