python / python/typeshed

Mapping overloads cause incorrect variance inference

Offen
#15,500 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
5.1k
Forks
2.1k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
82

Beschreibung

https://mypy-play.net/?gist=42b235155079dd44a79e66cbcffb0060

from collections.abc import Mapping

class A: ...
class B(A): ...

def test_mapping() -> None:
    class MyMapping[K, V](Mapping[K, V]): ...

    def _0[K](arg: Mapping[K, B]) -> Mapping[K, A]: return arg
    def _1[K](arg: MyMapping[K, B]) -> MyMapping[K, A]: return arg  # ❌️

mypy doesn't seem to reuse known variance of parent classes, but instead rechecks everything. For mapping, this breaks and mypy incorrectly infers invariance in the value type because of:

https://github.com/python/typeshed/blob/a9fbf47e676865bd5bcd94e121624d9e4b53c882/stdlib/typing.pyi#L787-L788

While I do think mypy could improve this behavior on their side, we really, really should avoid using covariant parameters in contravariant positions, especially with the knowledge that it can screw up variance inference when using 3.12 style annotations.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das bereitgestellte Beispiel im mypy playground zu reproduzieren, und untersuche anschließend die Mapping-Definitionen in den verlinkten Zeilen 787–788 von typeshed typing.pyi. Bestimme, wie deren Varianzannotationen mit dem 3.12-style MyMapping-Beispiel interagieren; als erledigt gilt die Aufgabe, wenn das Beispiel nicht mehr den inkorrekten Varianzfehler erzeugt, ohne ein gleichwertiges Annotierungsproblem einzuführen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
tooling
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

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