`functools.partial` plugin is only triggered on calls
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
partial support is too fragile and easy to fool.
To Reproduce
import typing as t
from functools import partial
# 1.
# uncomment this to get type error
# partial(lambda x, y: x + y, 10)()
# 2.
# But this silly little thing passes type-check
silly: t.Callable[[], int] = partial(lambda x, y: x + y, 10)
silly()
Expected Behavior
Fail to coerce partial into incompatible callable type.
Actual Behavior
Success: no issues found in 1 source file
Your Environment
- Mypy version used: master
- Mypy command-line flags: no
- Mypy configuration options from
mypy.ini(and other config files): - Python version used: 3.12
Looks like we carry information about needed arguments somewhere anyways, since 1 fails type check due to not enough arguments, so why we allow to coerce that partial into incompatible callable?
Perhaps this is due to this definition of partial:
def __call__(self, /, *args: Any, **kwargs: Any) -> _T: ...
But, for example, pyright takes that into account and fails as expected:
[nix-shell:/tmp]$ pyright issue.py
/tmp/issue.py
/tmp/issue.py:10:30 - error: Expression of type "partial[Unknown]" is incompatible with declared type "() -> int"
Type "partial[Unknown]" is incompatible with type "() -> int"
Extra parameter "y" (reportAssignmentType)
1 error, 0 warnings, 0 informations
I think it worth fixing, since we support partial and it is useful to rely on that support. It can be fixed, for example, as viewing partial result internally not as partial[int] type, but as something like
class FakePartial(Protocol[P, Ret]):
@property
def args(self) -> tuple[Any, ...]: ...
@property
def keywords(self) -> dict[any, ...]: ...
@property
def func(self) -> t.Callable[..., Ret]: ...
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> Ret: ...
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
Reproduce los dos ejemplos usando Python 3.12 y mypy master, y compara después el comportamiento con la definición de typeshed functools.pyi enlazada en el issue. Rastrea el soporte existente para functools.partial y su información de argumentos. Se considera terminado cuando se rechaza la asignación incompatible a un callable sin argumentos, mientras que las llamadas válidas a partial siguen pasando la comprobación de tipos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 30/100