python / python/mypy

Lambda type cannot be inferred when type context includes a callable with a callable parameter

Offen
#16,523 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

This was filed as a pyright bug. I noticed that mypy likewise doesn't handle this case, and I couldn't find any open issues that cover this.

Mypy playground link

from typing import Callable, Generic, TypeVar

T = TypeVar("T")

def func1(callable: Callable[[Callable[[T], T]], T]) -> T:
    return callable(lambda x: x)

v1 = func1(lambda a: a(0))
reveal_type(v1)  # Should be int

v2 = func1(lambda a: a(""))
reveal_type(v2)  # should be str

class A(Generic[T]):
    def __init__(self, value: T) -> None:
        self.value = value

def func2(callable: Callable[[type[A[T]]], A[T]]) -> T:
    return callable(A).value

v3 = func2(lambda A: A(0))
reveal_type(v3)  # Should be int

v4 = func2(lambda A: A(""))
reveal_type(v4)  # Should be str

Expected Results: No Errors and revealed types as indicated in the comments

Actual Results: Multiple errors ("Need type annotation for ...").

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 mit dem verlinkten mypy playground und führe den enthaltenen Python-Reproducer aus, der Callable, Generic und TypeVar verwendet. Vergleiche die aufgedeckten Typen für v1 bis v4 mit den erwarteten Ergebnissen int und str; abgeschlossen ist die Aufgabe, wenn die Beispiele keine Fehler erzeugen und diese Typen aufdecken.

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
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

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