Pydantic validation blues
Pydantic’s FilePath
is like Path except that the file has to exist and be a file.
BUT FilePath
when validating expects a string as input, not a Path!
(in other words: FilePath(Path)
doesn’t seem to work)
So when I create a Validator that converts str
into Path
1:
@field_validator("filename", mode="before")
@classmethod
def parse_filename(cls, value: str | Path) -> Path:
return Path(value)
I get a wonderful
> doc = UCFDocument.model_validate_json(json_string)
E pydantic_core._pydantic_core.ValidationError: 1 validation error for UCFDocument
E filename
E Input is not a valid path for <class 'pathlib.Path'> [type=path_type, input_value=PosixPath('/home/sh/w/cor...n/doc.pdf_data/doc.pdf'), input_type=PosixPath]
tests/ucf/test_data_structures.py:179: ValidationError
Again, the error is a PosixPath
not being a Path, though it is one:
E Input is not a valid path for <class 'pathlib.Path'> [type=path_type, input_value=PosixPath('/home/sh/w/cor...n/doc.pdf_data/doc.pdf'), input_type=PosixPath]
# explicitly expecting a PosixPath creates an even better
E Input is not a valid path for <class 'pathlib.PosixPath'> [type=path_type, input_value=PosixPath('/home/sh/w/cor...n/doc.pdf_data/doc.pdf'), input_type=PosixPath]
Not intuitive at all.
Solution is to give FilePath strings and only strings, or drop FilePath
to begin with.
├── pydantic v2.10.6
│ ├── annotated-types v0.7.0
│ ├── pydantic-core v2.27.2
│ │ └── typing-extensions v4.12.2
-
(don’t ask why I needed this, this is a minimal reproducible example only) ↩︎
Nel mezzo del deserto posso dire tutto quello che voglio.
comments powered by Disqus