confusing type error when using overloads
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par exécuter la reproduction mypy-play liée et comparez l’appel à overload à la ligne 65 de main.py avec parse_other à la ligne 68. Suivez la manière dont la résolution de overload sélectionne les diagnostics ; le travail est terminé lorsque l’argument incorrect est signalé avec le message direct de type incompatible, tout en préservant les erreurs de overload utiles pour les incompatibilités réelles.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 38/100