The validation evolution: Pydantic V2tronger - Marcelo Trylesinski

Tags: python, pun

(One of my summaries of the 2023 Dutch pythonconferentie python meeting in Utrecht, NL).

Pydantic is a data validation library. It uses/extends python type hints to work during runtime instead of statically.

Pydantic recently went from version 1 to 2. One of the changes was to split pydantic in a few packages. Pydantic core is now partially written in Rust! Some other changes:

  • In Version 1 you could add a Config class inside your model class, but it was sensitive to spelling mistakes. Now they use a model_config attribute that prevents errors.

  • As they were breaking the API anyway, they took the opportunity to change lots of names to make them clearer.

  • @validator is now @field_validator which accepts extra attributes, for instance for doing a special check before or after the regular validation. “After” validations are handy as you can run a check after pydaantic has ensured it was the correct type, this prevents lots of error handling in your custom validation.

  • BaseSettings is now in a separate python package as it got a bit too big.

  • Several __something__ methods were changed to give you more options to change pydantic’s behaviour.

Some performance tips (see also https://docs.pydantic.dev/latest/concepts/performance/ ):

  • Use model_validate_json() on a json string instead of model_validate(json.loads(...)), as the string gets send to Rust directly, which is quicker.

  • TypeAdapter can help you speed up your code if you instantiate a similar type multiple times.

  • Use Literal, not Enum.

  • Use TypedDict instead of nested models.

If there is a version 3, it won’t be as big as a change as from 1 to 2.

 
vanrees.org logo

Reinout van Rees

My name is Reinout van Rees and I program in Python, I live in the Netherlands, I cycle recumbent bikes and I have a model railway.

Weblog feeds

Most of my website content is in my weblog. You can keep up to date by subscribing to the automatic feeds (for instance with Google reader):