confusing type error when using overloads
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza ejecutando la reproducción enlazada de mypy-play y compara la llamada a overload en main.py, línea 65, con parse_other en la línea 68. Traza cómo la resolución de overload selecciona los diagnósticos; se considera terminado cuando el argumento incorrecto se señala con el mensaje directo de tipo incompatible, preservando al mismo tiempo los errores de overload útiles para las discrepancias genuinas.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100