python / python/mypy

confusing type error when using overloads

Offen
#14,976 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

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

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, 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

Neue Issues direkt in Ihr Postfach

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