# Pydantic Data validation and settings management using [[python|Python]] type annotations. [Pydantic Documentation](https://docs.pydantic.dev) ## Usage One good usage of Pydantic is settings validation. It can load secrets from env, files, and customize the priority of sources. ### Models - File Parsing: `parse_obj` (similar to `__init__` but takes a `dict`), `parse_raw`, `prase_file` - Models can be created at runtime dynamically - Custom `__root__` type can be specified, so that argument of `parse_obj` will be validated against the root type. Similarly, custom `__iter__`, `__getitem__` can be implemented, to allow Pydantic models support a type other than mapping. - `Config` - `allow_mutable` can be turned off - `orm_mode` can be enabled to make `parse_obj` support models beyond dict. - `underscore_attrs_are_private` can be set - Field orders are preserved -- only guaranteed on annotated fields. - Declare required fields by only annotation or `...` as the value. `a: int | None` is optional, `a: int | None = ...` can be `None` but is required. - `Field(default_factory=...)` to set dynamic defaults. - `ClassVar` and `PrivateVar` can be used. - Structural pattern matching is supported: `case Pet(species='dog', name=dog_name)` ### Field Types - Use `@validator('infinite')` to validate the first value in a generator without actually consuming the value. - With `Union`, Pydantic attempts to use the first matched type, this can lead to unexpected behaviors. (e.g. `UUID` treated as an `int`). Thus the first type in union should be the most specific. - `pet: Cat | Dog = Field(..., discriminator='pet_type)`, the discriminator must be a field under types that are discriminated among. - `@validate_argument` - Can be used to validate the arguments of a function. - `Field` can be used in function signature to provide validation. - `func.validate(arg1, arg2)` can be used to validate args without calling. - `func.raw_function` can be used to directly call the function - Use `TypeAdapter` to create ad-hoc validators for non-`BaseModel` types.