Unions of `TypedDict` turn into intersections in some generic functions
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
When passing unions of TypedDict to certain generic functions, mypy deduces their type to be the intersection of the TypedDicts, and not the union.
Discovered here.
To Reproduce
from typing import TypedDict, TypeVar
class A(TypedDict):
shared: str
different: str
class B(TypedDict):
shared: str
different: int
extra: int
T = TypeVar("T")
def f(a: T, b: T) -> T:
return b
def g(a: T | None, b: T) -> T:
return b
c: A | B
d: A | B
r1: A | B = f(c, d) # passes
r2: A | B = g(c, d) # expression has type "TypedDict({'shared': str}) [assignment]
Expected Behavior
g(c, d) should have type A | B and not {"shared": str}.
Actual Behavior
mypy_error.py:23: error: Incompatible types in assignment (expression has type "TypedDict({'shared': str})", variable has type "Union[A, B]") [assignment]
Found 1 error in 1 file (checked 1 source file)
Your Environment
- Mypy version used: mypy 1.0.0 (compiled: yes)
- Same error on mypy 0.800, Python 3.10.9
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files): none - Python version used: Python 3.10.9
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
Beginnen Sie damit, den minimalen Python-Reproducer aus dem Issue auszuführen, und vergleichen Sie die abgeleiteten Typen von f(c, d) und g(c, d). Verfolgen Sie mypys generische Typinferenz für TypedDict-Unionen, fügen Sie dann einen Regressionstest hinzu, der das Beispiel abdeckt, und bestätigen Sie, dass g(c, d) als A | B akzeptiert wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 40/100