Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

`mypy` widens multiple type parameters even when only the first one is relevant

Offen
#21,903 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
48/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
python
Bereich
devtools

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.

Beschreibung

bug topic-inference

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)

Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
Ø Merge
1 T. 3 Std.
Gemergte PRs (30 T.)
59

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus python/mypy

Alle Issues in python/mypy

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.