confusing type error when using overloads
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
when using overloads, the type errors for mistakes are confusingly hidden
https://mypy-play.net/?mypy=latest&python=3.11&gist=bd18c94e9aa3e0eb5bbd58d670a1f166
from __future__ import annotations
from typing import overload, Callable, TypeVar
import subprocess
import logging
log = logging.getLogger(__name__)
PARSE_RESULT= TypeVar("PARSE_RESULT")
T = TypeVar("T")
@overload
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: None = None,
error_msg: str | None = None,
) -> PARSE_RESULT | None:
...
@overload
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: T,
error_msg: str | None = None,
) -> PARSE_RESULT | T:
...
def parse_success(
res: subprocess.CompletedProcess[str],
*,
parse: Callable[[str], PARSE_RESULT],
default: T | None = None,
error_msg: str | None = None,
) -> PARSE_RESULT | T | None:
if res.returncode:
if error_msg:
log.warning("%s %s", error_msg, res)
return default
else:
return parse(res.stdout)
def parse_other(
res: subprocess.CompletedProcess[str]) -> str:
return res.stdout
example = subprocess.CompletedProcess("example", 0, "wrong", "ignored")
def myparse(data: str) -> int|None:
try:
return int(data)
except Exception: #diaper
return None
parse_success((example,), parse=myparse, error_msg=":)")
parse_other((example,))
Expected Behavior
main.py:65: error: Argument 1 to "parse_success" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
main.py:68: error: Argument 1 to "parse_other" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Actual Behavior
main.py:65: error: No overload variant of "parse_success" matches argument types "Tuple[CompletedProcess[str]]", "Callable[[str], Optional[int]]", "str" [call-overload]
main.py:65: note: Possible overload variants:
main.py:65: note: def [PARSE_RESULT] parse_success(res: CompletedProcess[str], *, parse: Callable[[str], PARSE_RESULT], default: None = ..., error_msg: Optional[str] = ...) -> Optional[PARSE_RESULT]
main.py:65: note: def [PARSE_RESULT, T] parse_success(res: CompletedProcess[str], *, parse: Callable[[str], PARSE_RESULT], default: T, error_msg: Optional[str] = ...) -> Union[PARSE_RESULT, T]
main.py:68: error: Argument 1 to "parse_other" has incompatible type "Tuple[CompletedProcess[str]]"; expected "CompletedProcess[str]" [arg-type]
Found 2 errors in 1 file (checked 1 source file)
Your Environment
replicated this in the playground on 1.1.1
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, die verlinkte mypy-play-Reproduktion auszuführen, und vergleiche den Overload-Aufruf in main.py in Zeile 65 mit parse_other in Zeile 68. Verfolge, wie die Overload-Auflösung Diagnosen auswählt; abgeschlossen ist die Aufgabe, wenn das falsche Argument mit der direkten Meldung zum inkompatiblen Typ gemeldet wird und zugleich nützliche Overload-Fehler bei echten Nichtübereinstimmungen erhalten bleiben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100