`mypy` widens multiple type parameters even when only the first one is relevant
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 there are two type parameters to widen, mypy widens both to Any, even when the matched overloads agree on the second parameter and only actually disagree on the first.
Related to #19952
To Reproduce
https://mypy-play.net/?gist=6ab5724e788384125e85da02ae0386d3
from collections.abc import Sequence
from typing import Any, Generic, Protocol, assert_type, overload
from typing_extensions import TypeVar
S1 = TypeVar("S1")
class EA: ...
A = TypeVar("A", bound=EA, default=EA, covariant=True)
S2 = TypeVar("S2", bound=EA)
S2_contra = TypeVar("S2_contra", bound=EA, contravariant=True)
class Supports_ProtoAdd(Protocol[S2_contra, S2]):
def _proto_add(self, other: S2_contra, /) -> "Ser2[S2, EA]": ...
class Ser2(Generic[S1, A]):
def _proto_add(self, other: Any, /) -> "Ser2[Any, EA]":
raise NotImplementedError
@overload
def __add__(
self: Supports_ProtoAdd[S2_contra, S2],
other: "S2_contra | Sequence[S2_contra]",
) -> "Ser2[S2]": ...
@overload
def __add__(self: "Ser2[bool, EA]", other: Sequence[Any]) -> "Ser2[int]": ...
def __add__(self, other: Any) -> Any:
raise NotImplementedError
def f(a2: "Ser2[Any, EA]", seq: "Sequence[Any]") -> None:
assert_type(a2 + seq, "Ser2[Any, EA]")
# error: Expression is of type "Ser2[Any, Any]", not "Ser2[Any, EA]" [assert-type]
Expected Behaviour
Error free, as is the case for pyright, pyrefly and ty
Actual Behaviour
main.py:24: error: Expression is of type "Ser2[Any, Any]", not "Ser2[bool, EA]" [assert-type]
Found 1 error in 1 file (checked 1 source file)
Your Environment*
mypy 2.3.1 (playground)
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, die verknüpfte mypy-play-Reproduktion auszuführen, und vergleiche den inferierten Typ mit der Erwartung von assert_type. Verfolge anschließend das Overload-Matching und die Logik zur Erweiterung von Typparametern, die am add-Aufruf beteiligt sind, und füge einen Regressionstest hinzu, der zeigt, dass nur der nicht übereinstimmende Parameter erweitert wird, während der gemeinsame EA-Parameter erhalten bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Aktiv
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 48/100