python / python/mypy

Cannot infer value of constrained type parameter when calling function with union

Offen
#19,834 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-inference topic-type-variables
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

I have a function that takes in either a list of X or a list of Y, and returns a list of the same X or Y that was input. When calling the function with a variable that's either list of X or a list of Y, I expect it to work the same as calling the function with either.

To Reproduce

from typing import TypeVar

StrOrInt = TypeVar("StrOrInt", str, int)

def func(vals: list[StrOrInt]) -> list[StrOrInt]:
    return vals

def action(strs: list[str], ints: list[int]) -> None:
    reveal_type(func(strs))
    reveal_type(func(ints))

    strOrInt: list[str] | list[int] = strs if strs else ints
    reveal_type(func(strOrInt))

Expected Behavior

test.py:9: note: Revealed type is "builtins.list[builtins.str]"
test.py:10: note: Revealed type is "builtins.list[builtins.int]"
test.py:13: note: Revealed type is "builtins.list[builtins.str] | builtins.list[builtins.int]"

Actual Behavior

test.py:9: note: Revealed type is "builtins.list[builtins.str]"
test.py:10: note: Revealed type is "builtins.list[builtins.int]"
test.py:13: error: Cannot infer value of type parameter "StrOrInt" of "func"  [misc]
test.py:13: note: Revealed type is "builtins.list[Any]"

Your Environment

  • Mypy version used:
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used:

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, den bereitgestellten Python-Reproduzierer mit mypy auszuführen, und vergleiche die drei aufgedeckten Typen mit der erwarteten Ausgabe. Untersuche die Inferenz von Typparametern für ein Argument vom Typ list[str] | list[int]; abgeschlossen ist die Aufgabe, wenn der Union-Aufruf akzeptiert wird und list[str] | list[int] ohne einen Inferenzfehler aufdeckt.

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.