Order of declarations matters, but it shouldn't
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia eseguendo il riproduttore bug.py fornito con i flag stricti di mypy, oppure usa l’esempio mypy-play collegato, e confronta le diagnosi per function1 e function2. Traccia la gestione dell’ordine delle dichiarazioni per le annotazioni posticipate e gli inizializzatori decorati; il lavoro è completato quando il riproduttore non segnala errori, incluso no-any-return per function1.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- devtools
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100