mypy seems to use type from field definition instead of type of field_validator
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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]
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia eseguendo l'Example Code con mypy e confronta gli errori segnalati con il tipo restituito dal validator. Verifica come mypy rappresenta il tipo dichiarato del campo vettoriale e se le informazioni di field_validator sono disponibili per il controllo dei tipi. Il lavoro è completato quando le operazioni di divisione e sottrazione mostrate non richiedono più i commenti type: ignore elencati, mantenendo il comportamento esistente.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- numpy, python
- Ambito
- devtools, tooling
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100