* starting insert prints * working exec_script * remove prints, fix exec_examples.py * more cleanup of examples, better model printing * upgrade netlify runtime * extra docs deps * few more small tweaks
2.5 KiB
If you don't want to use pydantic's BaseModel you can instead get the same data validation on standard
dataclasses (introduced in python 3.7).
Dataclasses work in python 3.6 using the dataclasses backport package.
{!.tmp_examples/ex_dataclasses.py!}
(This script is complete, it should run "as is")
!!! note
Keep in mind that pydantic.dataclasses.dataclass is a drop-in replacement for dataclasses.dataclass
with validation, not a replacement for pydantic.BaseModel. There are cases where subclassing
pydantic.BaseModel is the better choice.
For more information and discussion see
[samuelcolvin/pydantic#710](https://github.com/samuelcolvin/pydantic/issues/710).
You can use all the standard pydantic field types, and the resulting dataclass will be identical to the one
created by the standard library dataclass decorator.
pydantic.dataclasses.dataclass's arguments are the same as the standard decorator, except one extra
keyword argument config which has the same meaning as Config.
!!! note
As a side effect of getting pydantic dataclasses to play nicely with mypy, the config argument will show
as invalid in IDEs and mypy. Use @dataclass(..., config=Config) # type: ignore as a workaround.
See [python/mypy#6239](https://github.com/python/mypy/issues/6239) for an explanation of this issue.
For more information about combining validators with dataclasses, see dataclass validators.
Nested dataclasses
Nested dataclasses are supported both in dataclasses and normal models.
{!.tmp_examples/ex_nested_dataclasses.py!}
(This script is complete, it should run "as is")
Dataclasses attributes can be populated by tuples, dictionaries or instances of the dataclass itself.
Initialize hooks
When you initialize a dataclass, it is possible to execute code after validation
with the help of __post_init_post_parse__. This is not the same as __post_init__, which executes
code before validation.
{!.tmp_examples/ex_post_init_post_parse.py!}
(This script is complete, it should run "as is")
Since version v1.0, any fields annotated with dataclasses.InitVar are passed to both __post_init__ and
__post_init_post_parse__.
{!.tmp_examples/ex_post_init_post_parse_initvars.py!}
(This script is complete, it should run "as is")