Limited inference with union of callables and assignment to a union
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
Apologies if this was raised already. The only related issue I could find is https://github.com/python/mypy/issues/15887.
In Pydantic 2.10, we changed the definition of our field function to be:
from typing import Callable, TypeVar
_T = TypeVar('_T')
def Field(
*,
default_factory: Callable[[], _T] | Callable[[dict[str, Any]], _T],
) -> _T: ...
While this type checks correctly for some common use cases, we get errors when the Field function is assigned to a union of types, or when the default factory signature isn't trivial (e.g. contains overloads). Here are some examples failing:
EDIT: Seems like the issue was fixed since 1.16.0. The issue with Class.b remains:
cvar = ContextVar[None]("session_id", default=None)
class Class:
# error: Argument "default_factory" to "Field" has incompatible type "type[list[Any]]"; expected "Callable[[], Never] | Callable[[dict[str, Any]], Never]" [arg-type]:
a: list | None = Field(default_factory=list)
# error: Argument "default_factory" to "Field" has incompatible type overloaded function; expected "Callable[[], Never] | Callable[[dict[str, Any]], Never]" [arg-type]:
b: None = Field(default_factory=cvar.get) # note that `cvar.get` is overloaded. The first overload (`() -> None`) should match.
# fine:
fine: list = Field(default_factory=list)
Note that (at least for a), this worked as expected with the old type inference.
I first wanted to know if this can be considered a mypy limitation, or is the code really unsafe in some way? Or maybe is it because the typing spec does not provide any info regarding these use cases?
In comparison, pyright and pyre accepts the provided examples. We will currently recommend users to add a type: ignore comment and redirect to this issue. However, feel free to close if there's already an issue tracking this.
Thanks in advance
Your Environment
- Mypy version used: 1.13
- Mypy command-line flags: None
- Mypy configuration options from
mypy.ini(and other config files): None - Python version used: 3.13
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
Comienza con el reproductor proporcionado de Python 3.13 y el playground enlazado, centrándote en el caso restante Class.b, en el que ContextVar.get está sobrecargado y se pasa a Field. Compara el comportamiento con la inferencia anterior descrita en el informe y, después, añade una prueba de regresión que muestre que la primera sobrecarga () -> None se acepta sin un type: ignore.
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
- 45/100