Order of declarations matters, but it shouldn't
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
This replaces #14509.
Bug Report
The order of declarations shouldn't matter to mypy w.r.t.[^wrt] type annotations when from __future__ import annotations is in effect, but in the example that follows, they do.
To Reproduce
Analyze the following code with --strict (or run on mypy-play.net):
from __future__ import annotations
import functools
from typing import (
Any,
Callable,
cast,
Counter,
Optional,
TypeVar,
)
Tc = TypeVar('Tc', bound=Callable[..., Any])
def func_wraps(wraps: Tc) -> Callable[[Callable[..., Any]], Tc]:
'''declare that one function wraps another
Args:
wraps: the function being wrapped
Returns:
a function 'decorator()', where...
Args:
the function which wraps 'wraps'
Returns:
the input argument, unchanged
The type annotations of the return value of the 'decorator()' will
be those of 'wraps'.
'''
def inner(wrapper: Callable[..., Any], /) -> Tc:
'''decorator
Args:
wrapper: the function which wraps 'wraps'
Returns:
the same function, unchanged
'''
wrapper_ = cast(Tc, wrapper)
return functools.wraps(wraps)(wrapper_)
return inner
def function1() -> ChildClass:
return ChildClass()
class ParentClass:
def __init__(self, *, param: Optional[int] = None) -> None:
_ = param
class ChildClass(ParentClass):
some_counter: Counter[int]
@func_wraps(ParentClass.__init__)
def __init__(self, *args: Any, **kwargs: Any):
super().__init__(*args, **kwargs)
self.some_counter = Counter()
def function2() -> ChildClass:
return ChildClass()
Expected Behavior
There should be no errors.
Actual Behavior
The following error is issued w.r.t.[^wrt] function1:
bug.py:47: error: Returning Any from function declared to return "ChildClass" [no-any-return]
Found 1 error in 1 file (checked 1 source file)
Your Environment
- Mypy version used: 0.991, master (2023-01-24)
- Mypy command-line flags:
--show-error-codes --strict --warn-unreachable - Mypy configuration options from
mypy.ini(and other config files): N/A - Python version used: 3.8, 3.11
[^wrt]: with respect to
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza ejecutando el reproductor bug.py proporcionado con los flags estrictos de mypy, o utiliza el ejemplo enlazado de mypy-play, y compara los diagnósticos de function1 y function2. Traza el procesamiento del orden de declaración para las anotaciones pospuestas y los inicializadores decorados; se considera completado cuando el reproductor no informa de ningún error, incluido no-any-return para function1.
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
- Bien especificado
- Aptitud para principiantes
- 35/100