python / python/mypy

Cannot infer type of lambda when using default arguments

Offen
#12,557 11 Kommentare 13 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

Bug Report

I get error: Cannot infer type of lambda even though the code seems fine to me.

Currently, I don't see any other workaround other than using # type: ignore.

To Reproduce

from typing import Callable, List

def foo(factories: List[Callable[[], int]]):
    return sum(f() for f in factories)

names = ["0", "abc"]
# Inference works fine
assert foo([lambda: len(name) for name in names]) == 4
# Cannot infer type of lambda
assert foo([lambda name=name: len(name) for name in names]) == 4

def foo2(factories: List[Callable[[int], int]]):
    return sum(f(0) for f in factories)

# Inference works fine
assert foo2([lambda i: len(name) for name in names]) == 4
# Cannot infer type of lambda
assert foo2([lambda i, name=name: len(name) for name in names]) == 4

Checked with:

mypy mypy-lambda-test.py

Expected Behavior

There should be no error. Especially because the other variants without default arguments are deemed fine.

Furthermore, using default arguments like this is the standard workaround to capture loop variables to lambdas.

Your Environment

  • Mypy version used: 0.942
  • Python version used: 3.9.7
  • Operating system and version: Ubuntu 21.10

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 den Lambda-Beispielen in mypy-lambda-test.py und führe mypy mypy-lambda-test.py mit den angegebenen Python- und mypy-Versionen aus. Vergleiche die funktionierenden Lambdas mit den Varianten, die name über ein Standardargument erfassen. Als abgeschlossen gilt die Aufgabe, wenn alle vier Assertions eine Typprüfung bestehen, ohne # type: ignore zu erfordern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

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

Neue Issues direkt in Ihr Postfach

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