generic type assertion is incompatible with generic sorted key

Offen
#10,500 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
35/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
python
Bereich
devtools

Rechercherichtung

Beginne damit, das Beispiel mit mypy 0.800 zu reproduzieren, und untersuche die überladene sorted-Signatur in der verknüpften typeshed builtins.pyi. Erledigt ist die Aufgabe, wenn die key-Lambda Eingaben vom Typ str | None akzeptiert, unwrap(x) als str inferiert wird und der upper-Attributfehler verschwindet.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug

Bug Report

I have a function that removes the nullability of a value, so it takes T | None and returns T. This function doesn't seem to work in functions that have overloaded generic function args, like sorted.

If I create my own sorted function without an overload, this issue doesn't occur.

def my_sorted(__iterable: Iterable[_T], *, key: Callable[[_T], SupportsLessThan], reverse: bool = ...) -> List[_T]: ...

To Reproduce

from __future__ import annotations

from typing import TypeVar

T = TypeVar("T")


def unwrap(val: T | None) -> T:
    assert val is not None
    return val


x: list[str | None]
sorted(x, key=lambda x: unwrap(x).upper())
#                       <nothing> has no attribute "upper"  [attr-defined]

Expected Behavior
unwrap(x) should return str.

Actual Behavior

unwrap(x) returns <nothing>.

Your Environment

  • Mypy version used: 0.800
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
Ø Merge
1 T. 18 Std.
Gemergte PRs (30 T.)
54

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.