Argument type `Union[T, List[T]]` fails to infer constaints
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
While working on #11128 I got hit by this.
This code does not type check:
from typing import TypeVar, Union, List
T1 = TypeVar("T1")
def promote_list(item: Union[T1, List[T1]]) -> List[T1]:
...
exprs: List[int]
reveal_type(promote_list(exprs)) # error
# ex.py:9: note: Revealed type is "builtins.list[<nothing>]"
# ex.py:9: error: Argument 1 to "promote_list" has incompatible type "List[int]"; expected "List[<nothing>]"
reveal_type(promote_list(1)) # ok
# Revealed type is "builtins.list[builtins.int*]"
Which is not what I expect. For example, TypeScript solves this properly:
function protomoteList<T>(input: T | T[]): T[] {
return []
}
function test(input: number[]) {}
test(protomoteList(1)) # ok
Cause
It happens somewhere here: https://github.com/python/mypy/blob/b3ff2a683bd41a176c597d3c3ba65f6a31f805c5/mypy/constraints.py#L168-L171
I will try to solve this, but I know that this is going to be complicated.
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 con la riproduzione nell’issue e ispeziona mypy/constraints.py intorno alle righe 168-171, dove si verifica la causa segnalata. Conferma il comportamento attuale per Union[T1, List[T1]] con le chiamate reveal_type fornite; il lavoro è completato quando l’argomento di tipo List[int] supera il controllo dei tipi e il risultato viene inferito come List[int].
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100