A flake8 plugin to check Pydantic related code.
Project description
Flake8 Pydantic
A flake8
plugin to check Pydantic related code.
Class detection
flake8_pydantic
parses the AST to emit linting errors. As such,
it cannot accurately determine if a class is defined as a Pydantic model. However, it tries its best, using the following heuristics:
- The class inherits from
BaseModel
orRootModel
. - The class has a
model_config
attribute set. - The class has a field defined with the
Field
function. - The class has a field making use of
Annotated
. - The class makes use of Pydantic decorators, such as
computed_field
ormodel_validator
. - The class overrides any of the Pydantic methods, such as
model_dump
.
Error codes
PYD001
- Positional argument for Field default argument
Raise an error if the default
argument of the Field
function is positional.
class Model(BaseModel):
foo: int = Field(1)
Although allowed at runtime by Pydantic, it does not comply with the typing specification (PEP 681) and type checkers will not be able to synthesize a correct __init__
method.
Instead, consider using an explicit keyword argument:
class Model(BaseModel):
foo: int = Field(default=1)
PYD002
- Non-annotated attribute inside Pydantic model
Raise an error if a non-annotated attribute is defined inside a Pydantic model class.
class Model(BaseModel):
foo = 1 # Will error at runtime
PYD003
- Unecessary Field call to specify a default value
Raise an error if the Field
function
is used only to specify a default value.
class Model(BaseModel):
foo: int = Field(default=1)
Instead, consider specifying the default value directly:
class Model(BaseModel):
foo: int = 1
PYD004
- Default argument specified in annotated
Raise an error if the default
argument of the Field
function is used together with Annotated
.
class Model(BaseModel):
foo: Annotated[int, Field(default=1, description="desc")]
To make type checkers aware of the default value, consider specifying the default value directly:
class Model(BaseModel):
foo: Annotated[int, Field(description="desc")] = 1
PYD005
- Field name overrides annotation
Raise an error if the field name clashes with the annotation.
from datetime import date
class Model(BaseModel):
date: date | None = None
Because of how Python evaluates annotated assignments, unexpected issues can happen when using an annotation name that clashes with a field name. Pydantic will try its best to warn you about such issues, but can fail in complex scenarios (and the issue may even be silently ignored).
Instead, consider, using an alias or referencing your type under a different name:
from datetime import date
date_ = date
class Model(BaseModel):
date_aliased: date | None = Field(default=None, alias="date")
# or
date: date_ | None = None
PYD010
- Usage of __pydantic_config__
Raise an error if a Pydantic configuration is set with __pydantic_config__
.
class Model(TypedDict):
__pydantic_config__ = {} # Type checkers will emit an error
Although allowed at runtime by Python, type checkers will emit an error as it is not allowed to assign values when defining a TypedDict
.
Instead, consider using the with_config
decorator:
@with_config({"str_to_lower": True})
class Model(TypedDict):
pass
And many more to come.
Roadmap
Once the rules of the plugin gets stable, the goal will be to implement them in Ruff, with autofixes when possible.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file flake8_pydantic-0.3.1.tar.gz
.
File metadata
- Download URL: flake8_pydantic-0.3.1.tar.gz
- Upload date:
- Size: 11.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 40b975dd5b812e5c369d75affde4f63e5aab73abf179a1d3cc9b23be5c24e86a |
|
MD5 | 74f7a196f97a84097ce141f516d06b3f |
|
BLAKE2b-256 | 156fc45ab43c8abcf712447958d7b4674e5e85e7bcaa8e30a00534b75f2aba06 |
File details
Details for the file flake8_pydantic-0.3.1-py3-none-any.whl
.
File metadata
- Download URL: flake8_pydantic-0.3.1-py3-none-any.whl
- Upload date:
- Size: 9.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9177b5ad48557b280b0a963f9e68954e651bdb78469e56d505623a14295e56f5 |
|
MD5 | 76eac38f13c2e1f540bb0888f215054e |
|
BLAKE2b-256 | 478237f365fc2bfc78fe0e4ce1ff5a9131143d088a3f28943a6c0e02307ab574 |