mypy seems to use type from field definition instead of type of field_validator
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
Description
I created a class that accepts a field with both a list[float] and a NDArray which converts it to NDArray after field validation (set to always via ConfigDict(validate_assignment = True)). However mypy complains about divide and substract operations over the vector field which should not as the field cannot be of type list[float] after validation.
At the moment I am using the # type: ignore[call-overload, operator] (Without those I get mypy errors).
Note: I have raised same issue in pydantic (https://github.com/pydantic/pydantic/issues/7262)
Example Code
import numpy as np
from numpy.typing import NDArray
from pydantic import BaseModel, ConfigDict, Field, computed_field, field_validator
class Vector(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True, validate_assignment=True)
vector: NDArray[np.float64] | list[float] = Field(default=np.array([0.0, 0.0, 0.0]), min_length=3, max_length=3)
@field_validator("vector")
@classmethod
def vector_validator(cls, v: NDArray[np.float64] | list[float]) -> NDArray:
if isinstance(v, list):
return np.array(v)
return v
@computed_field # type: ignore[misc]
@property
def x(self) -> NDArray:
return self.vector[0]
@x.setter
def x(self, value: float) -> None:
self.vector[0] = value
@computed_field # type: ignore[misc]
@property
def y(self) -> NDArray:
return self.vector[1]
@y.setter
def y(self, value: float) -> None:
self.vector[1] = value
@computed_field # type: ignore[misc]
@property
def z(self) -> NDArray:
return self.vector[2]
@z.setter
def z(self, value: float) -> None:
self.vector[2] = value
def to_unit(self) -> "Vector":
return Vector(vector=self.vector / np.linalg.norm(self.vector)) # type: ignore[call-overload, operator]
def __add__(self, other: "Vector") -> "Vector":
return Vector(vector=self.vector + other.vector)
def __sub__(self, other: "Vector") -> "Vector":
return Vector(vector=self.vector - other.vector) # type: ignore[operator]
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 el Example Code con mypy y compara los errores informados con el tipo de retorno del validador. Investiga cómo representa mypy el tipo declarado del campo vectorial y si la información de field_validator está disponible para la comprobación de tipos. La tarea estará terminada cuando las operaciones de división y resta mostradas ya no requieran los comentarios type: ignore indicados, manteniendo el comportamiento existente.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- numpy, python
- Área
- devtools, tooling
- Tipo de issue
- Error
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100