python / python/mypy

Mypy not detecting abstract methods returning undefined types

Abierto
#14,545 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug topic-runtime-semantics
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 have a class with a couple of abstract methods that return a particular custom type. That custom type is then defined right after the class. Then a global variable referencing that class is created:

To Reproduce

# test.py
from abc import ABC, abstractmethod
from typing import NamedTuple, List

class F(ABC):
    @abstractmethod
    async def m1(self) -> Result:
        pass
    
    @abstractmethod
    async def m2(self) -> Result:
        pass

class Result(NamedTuple):
    f1: str
    f2: int
    
foo: List[F] = []
> mypy --strict test.py
Success: no issues found in 1 source file
> python test.py
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    class F(ABC):
  File "test.py", line 6, in F
    async def m1(self) -> Result:
NameError: name 'Result' is not defined

Expected Behavior

I would expect mypy to detect that Result is not defined before its use in class F.

Actual Behavior

Mypy is happy with the code as it is, even under --strict, while Python can't even run the code as is. Moving the declaration of Result above class F solves the problem and both Python and mypy are then happy.

Your Environment

  • Mypy version used: 0.991
  • Mypy command-line flags: --strict
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.9.13

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

Reproduce el comportamiento de test.py ejecutando mypy --strict y después Python para comparar el resultado estático con el NameError en tiempo de ejecución. Rastrea cómo mypy analiza las anotaciones de retorno del método abstracto antes de que se declare Result. Se considera terminado cuando mypy informa de la referencia a Result no definida en este caso sin romper las anotaciones válidas.

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
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.