Files
pydantic/docs/index.md
T
2019-10-15 00:16:27 +01:00

120 lines
5.5 KiB
Markdown

[![BuildStatus](https://travis-ci.org/samuelcolvin/pydantic.svg?branch=master)](https://travis-ci.org/samuelcolvin/pydantic)
[![Coverage](https://codecov.io/gh/samuelcolvin/pydantic/branch/master/graph/badge.svg)](https://codecov.io/gh/samuelcolvin/pydantic)
[![pypi](https://img.shields.io/pypi/v/pydantic.svg)](https://pypi.python.org/pypi/pydantic)
[![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg)](https://anaconda.org/conda-forge/pydantic)
[![downloads](https://img.shields.io/pypi/dm/pydantic.svg)](https://pypistats.org/packages/pydantic)
[![license](https://img.shields.io/github/license/samuelcolvin/pydantic.svg)](https://github.com/samuelcolvin/pydantic/blob/master/LICENSE)
{!.version.md!}
!!! note
These docs refer to Version 1 of *pydantic* which is as-yet unreleased. **v0.32** docs are available
[here](https://5d584fcca7c9b70007d1c997--pydantic-docs.netlify.com).
Data validation and settings management using python type hinting.
Define how data should be in pure, canonical python; validate it with *pydantic*.
[PEP 484](https://www.python.org/dev/peps/pep-0484/) introduced type hinting into python 3.5;
[PEP 526](https://www.python.org/dev/peps/pep-0526/) extended that with syntax for variable annotation in python 3.6.
*pydantic* uses those annotations to validate that untrusted data takes the form you want.
There's also support for an extension to [dataclasses](usage/dataclasses.md) where the input data is validated.
## Example
```py
{!.tmp_examples/example1.py!}
```
_(This script is complete, it should run "as is")_
What's going on here:
* `id` is of type int; the annotation-only declaration tells *pydantic* that this field is required. Strings,
bytes or floats will be coerced to ints if possible; otherwise an exception will be raised.
* `name` is inferred as a string from the provided default; because it has a default, it is not required.
* `signup_ts` is a datetime field which is not required (and takes the value ``None`` if it's not supplied).
*pydantic* will process either a unix timestamp int (e.g. `1496498400`) or a string representing the date & time.
* `friends` uses python's typing system, and requires a list of inputs. As with `id`, integer-like objects
will be converted to integers.
If validation fails pydantic will raise an error with a breakdown of what was wrong:
```py
{!.tmp_examples/example2.py!}
```
outputs:
```json
{!.tmp_examples/example2.json!}
```
## Rationale
So *pydantic* uses some cool new language features, but why should I actually go and use it?
**no brainfuck**
: there's no new schema definition micro-language to learn. If you know python (and perhaps skim the
[type hinting docs](https://docs.python.org/3/library/typing.html)) you know how to use *pydantic*.
**plays nicely with your IDE/linter/brain**
: *pydantic* data structures are just instances of classes you define, so auto-completion, linting,
[mypy](usage/mypy.md), IDEs (especially [PyCharm](pycharm_plugin.md)), and your intuition should
all work properly with your validated data.
**dual use**
: *pydantic's* [BaseSettings](usage/settings.md) class allows *pydantic* to be used in both a "validate this request
data" context and in a "load my system settings" context. The main differences are that system settings can
be read from environment variables, and more complex objects like DSNs and python objects are often required.
**fast**
: In [benchmarks](benchmarks.md) *pydantic* is faster than all other tested libraries.
**validate complex structures**
: use of [recursive *pydantic* models](usage/models.md#recursive-models), `typing`'s
[standard types](usage/types.md#standard-library-types) (e.g. `List`, `Tuple`, `Dict` etc.) and
[validators](usage/validators.md) allow
complex data schemas to be clearly and easily defined, validated, and parsed.
**extensible**
: *pydantic* allows [custom data types](usage/types.md#custom-data-types) to be defined or you can extend validation
with methods on a model decorated with the [`validator`](usage/validators.md) decorator.
## Using Pydantic
Hundreds of organisations and packages are using *pydantic*, including:
[FastAPI](https://fastapi.tiangolo.com/)
: a high performance API framework, easy to learn,
fast to code and ready for production, based on *pydantic* and Starlette.
[Project Jupyter](https://jupyter.org/)
: developers of the Jupyter notebook are using *pydantic*
[for subprojects](https://github.com/samuelcolvin/pydantic/issues/773).
**Microsoft**
: are using *pydantic* (via FastAPI) for
[numerous services](https://github.com/tiangolo/fastapi/pull/26#issuecomment-463768795), some of which are
"getting integrated into the core Windows product and some Office products."
**Amazon Web Services**
: are using *pydantic* in [gluon-ts](https://github.com/awslabs/gluon-ts), an open-source probabilistic time series
modeling library.
**The NSA**
: are using *pydantic* in [WALKOFF](https://github.com/nsacyber/WALKOFF), an open-source automation framework.
**Uber**
: are using *pydantic* in [Ludwig](https://github.com/uber/ludwig), an an open-source TensorFlow wrapper.
**Cuenca**
: are a Mexican neobank that uses *pydantic* for several internal
tools (including API validation) and for open source projects like
[stpmex](https://github.com/cuenca-mx/stpmex-python), which is used to process real-time, 24/7, inter-bank
transfers in Mexico.
For a more comprehensive list of open-source projects using *pydantic* see the
[list of dependents on github](https://github.com/samuelcolvin/pydantic/network/dependents).