python / python/mypy

Mypy fails to type check function signature after plugin pass

Abierto
#18,166 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

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

Descripción

Bug Report

I wrote a plugin to replace types, but Mypy fails to typecheck after my changes. I start off trying to fix the type error in this signature with a plugin:

def almost_id(a: str) -> str:
    return int(a)

almost_id("6")

with my plugin:

def replace_str(self, ctx: FunctionSigContext) -> FunctionLike:
        api = ctx.api

        new_signature = ctx.default_signature.copy_modified(
            ret_type=api.named_type('builtins.int')
        )

        un_anal = new_signature.definition.unanalyzed_type.copy_modified(
            ret_type = api.named_type('builtins.int')
        )

        new_signature.definition.unanalyzed_type = un_anal

        typ = new_signature.definition.type.copy_modified(
            ret_type = api.named_type('builtins.int')
        )

        new_signature.definition.type = typ

        return new_signature

I have tried going through the attrs of the functionsigcontext, api and the expr_checker but can't seem to find some other functionality to either:

  • force mypy to proceed with type checking
  • modify the existing type analysis or map
  • delay type checking until the plugin mods have been completed, something like defer() in the semantic analyzer.

To Reproduce
gist: https://gist.github.com/dibrinsofor/bddcbd2eedbb233b131bb1b8d562369a

mypy tests/str_int.py

Expected Behavior

I expect mypy to pass

Actual Behavior

tests/str_int.py:2: error: Incompatible return value type (got "int", expected "str")  [return-value]

even though printing the new signature returns:

def (a: builtins.str) -> builtins.int

Your Environment

  • Mypy version used: 1.14.0+dev.8c7db13f71098a6facea66ab165b6bc3ef688bdf
  • Mypy command-line flags: --show-traceback
  • Python version used: Python 3.11.5

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

Ejecuta mypy tests/str_int.py usando la reproducción del gist y compara el error reportado con la firma impresa después de replace_str. Sigue cómo se consume el resultado de FunctionSigContext durante el análisis semántico y la comprobación de expresiones, usando las rutas expr_checker y defer() mencionadas en el informe. La tarea estará terminada cuando se respete el tipo de retorno modificado por el plugin y la reproducción pase.

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

Evaluación

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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.