Incorrect handling of unions of generics
Offen
Dieses Issue hat noch niemand übernommen.
bug
topic-type-variables
topic-union-types
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
This was originally reported in https://github.com/python/mypy/issues/3644#issuecomment-825494986
from typing import Callable, TypeVar, Generic, Union
_U = TypeVar('_U')
_T = TypeVar('_T')
class Future(Generic[_T]):
def __init__(self, t: _T):
self._t = t
def then(self, fn: Callable[[_T], Future[_U]]) -> Future[_U]:
return fn(self._t)
def then2(self, fn: Callable[[_T], _U]) -> Future[_U]:
return Future(fn(self._t))
def then3(self, fn: Union[Callable[[_T], Future[_U]], Callable[[_T], _U]]) -> Future[_U]:
ret = fn(self._t)
if isinstance(ret, Future):
return ret
else:
return Future(ret)
def foo(t: int) -> Future[str]:
return Future("str")
fut = Future(5)
reveal_type(fut.then(foo)) # is a Future[str], good
def foo2(t: int) -> str:
return "str"
reveal_type(fut.then2(foo2)) # also is a Future[str], good
reveal_type(fut.then3(foo)) # <<==== error, Future[<nothing>]
reveal_type(fut.then3(foo2))
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, den bereitgestellten Python-Reproducer mit mypy auszuführen und die reveal_type-Ergebnisse für then3 zu überprüfen. Verfolge die Inferenz für die Union aufrufbarer Typen, und betrachte das Issue als abgeschlossen, wenn sowohl foo als auch foo2 akzeptiert werden und Future[str] statt Future[nothing] inferiert wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers, devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100