Flake8 Type Annotation Checks
Project description
flake8-annotations
flake8-annotations is a plugin for Flake8 that detects the absence of PEP 3107-style function annotations.
What this won't do: replace mypy, check type comments (see: PEP 484), check variable annotations (see: PEP 526), or respect stub files.
Installation
Install from PyPi with your favorite pip invocation:
$ pip install flake8-annotations
It will then be run automatically as part of flake8.
You can verify it's being picked up by invoking the following in your shell:
$ flake8 --version
7.3.0 (flake8-annotations: 3.2.0, mccabe: 0.7.0, pycodestyle: 2.14.0, pyflakes: 3.4.0) CPython 3.14.0 on Darwin
Table of Warnings
With the exception of ANN4xx-level warnings, all warnings are enabled by default.
Function Annotations
| ID | Description |
|---|---|
ANN001 |
Missing type annotation for function argument |
ANN002 |
Missing type annotation for *args |
ANN003 |
Missing type annotation for **kwargs |
Method Annotations
| ID | Description |
|---|---|
ANN101 |
Missing type annotation for self in method1 |
ANN102 |
Missing type annotation for cls in classmethod1 |
Return Annotations
| ID | Description |
|---|---|
ANN201 |
Missing return type annotation for public function |
ANN202 |
Missing return type annotation for protected function |
ANN203 |
Missing return type annotation for secret function |
ANN204 |
Missing return type annotation for special method |
ANN205 |
Missing return type annotation for staticmethod |
ANN206 |
Missing return type annotation for classmethod |
Opinionated Warnings
These warnings are disabled by default.
| ID | Description |
|---|---|
ANN401 |
Dynamically typed expressions (typing.Any) are disallowed2,3 |
ANN402 |
Type comments are disallowed3 |
Use extend-select to enable opinionated warnings without overriding other implicit configurations4.
Notes:
- See: PEP 484 and PEP 563 for suggestions on annotating
selfandclsarguments - See: Dynamic Typing Caveats
- Only function declarations are considered by this plugin; type annotations in function/module bodies are not checked
- Common pitfall: the use of
ignorewill enable all implicitly disabled warnings
Configuration Options
Some opinionated flags are provided to tailor the linting errors emitted.
--suppress-none-returning: bool
Suppress ANN200-level errors for functions that meet one of the following criteria:
- Contain no
returnstatement, or - Explicit
returnstatement(s) all returnNone(explicitly or implicitly).
Default: False
--suppress-dummy-args: bool
Suppress ANN000-level errors for dummy arguments, defined as _.
Default: False
--allow-untyped-defs: bool
Suppress all errors for dynamically typed functions. A function is considered dynamically typed if it does not contain any type hints.
Default: False
--allow-untyped-nested: bool
Suppress all errors for dynamically typed nested functions. A function is considered dynamically typed if it does not contain any type hints.
Default: False
--mypy-init-return: bool
Allow omission of a return type hint for __init__ if at least one argument is annotated. See mypy's documentation for additional details.
Default: False
--dispatch-decorators: list[str]
Comma-separated list of decorators flake8-annotations should consider as dispatch decorators. Linting errors are suppressed for functions decorated with at least one of these functions.
Decorators are matched based on their attribute name. For example, "singledispatch" will match any of the following:
import functools; @functools.singledispatchimport functools as <alias>; @<alias>.singledispatchfrom functools import singledispatch; @singledispatch
NOTE: Deeper imports, such as a.b.singledispatch are not supported.
See: Generic Functions for additional information.
Default: "singledispatch, singledispatchmethod"
--overload-decorators: list[str]
Comma-separated list of decorators flake8-annotations should consider as typing.overload decorators.
Decorators are matched based on their attribute name. For example, "overload" will match any of the following:
import typing; @typing.overloadimport typing as <alias>; @<alias>.overloadfrom typing import overload; @overload
NOTE: Deeper imports, such as a.b.overload are not supported.
See: The typing.overload Decorator for additional information.
Default: "overload"
--allow-star-arg-any
Suppress ANN401 for dynamically typed *args and **kwargs.
Default: False
--respect-type-ignore
Suppress linting errors for functions annotated with a # type: ignore comment. Support is also provided for module-level blanket ignores (see: mypy: Ignoring a whole file).
NOTE: Type ignore tags are not considered, e.g. # type: ignore[arg-type] is treated the same as # type: ignore.
NOTE: Module-level suppression is only considered for the # mypy: ignore-errors or # type: ignore tags when provided as the sole contents of the first line of the module.
Default: False
Generic Functions
Per the Python Glossary, a generic function is defined as:
A function composed of multiple functions implementing the same operation for different types. Which implementation should be used during a call is determined by the dispatch algorithm.
In the standard library we have some examples of decorators for implementing these generic functions: functools.singledispatch and functools.singledispatchmethod. In the spirit of the purpose of these decorators, errors for missing annotations for functions decorated with at least one of these are ignored.
For example, this code:
import functools
@functools.singledispatch
def foo(a):
print(a)
@foo.register
def _(a: list) -> None:
for idx, thing in enumerate(a):
print(idx, thing)
Will not raise any linting errors for foo.
Decorator(s) to treat as defining generic functions may be specified by the --dispatch-decorators configuration option.
The typing.overload Decorator
Per the typing documentation:
The
@overloaddecorator allows describing functions and methods that support multiple different combinations of argument types. A series of@overload-decorated definitions must be followed by exactly one non-@overload-decorated definition (for the same function/method).
In the spirit of the purpose of this decorator, errors for missing annotations for non-@overload-decorated functions are ignored if they meet this criteria.
For example, this code:
import typing
@typing.overload
def foo(a: int) -> int:
...
def foo(a):
...
Will not raise linting errors for missing annotations for the arguments & return of the non-decorated foo definition.
Decorator(s) to treat as typing.overload may be specified by the --overload-decorators configuration option.
Dynamic Typing Caveats
Support is only provided for the following patterns:
from typing import any; foo: Anyimport typing; foo: typing.Anyimport typing as <alias>; foo: <alias>.Any
Nested dynamic types (e.g. typing.Tuple[typing.Any]) and redefinition (e.g. from typing import Any as Foo) will not be identified.
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flake8_annotations-3.2.0.tar.gz.
File metadata
- Download URL: flake8_annotations-3.2.0.tar.gz
- Upload date:
- Size: 14.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71b52ec85a4ec82a10edfad497fe2b390609c95b2ad7d61cc94704bc88a498a0
|
|
| MD5 |
9a5a87a0bbd62840a81bf4c4fab498ad
|
|
| BLAKE2b-256 |
99eaf36a8e013154f214715de01d46d98f12a673c7b978533079ac5caf4cbcce
|
Provenance
The following attestation bundles were made for flake8_annotations-3.2.0.tar.gz:
Publisher:
pypi_release.yml on sco1/flake8-annotations
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flake8_annotations-3.2.0.tar.gz -
Subject digest:
71b52ec85a4ec82a10edfad497fe2b390609c95b2ad7d61cc94704bc88a498a0 - Sigstore transparency entry: 597911322
- Sigstore integration time:
-
Permalink:
sco1/flake8-annotations@9f4dcad3f47c086d12958fe2f18776c324a38a65 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/sco1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi_release.yml@9f4dcad3f47c086d12958fe2f18776c324a38a65 -
Trigger Event:
release
-
Statement type:
File details
Details for the file flake8_annotations-3.2.0-py3-none-any.whl.
File metadata
- Download URL: flake8_annotations-3.2.0-py3-none-any.whl
- Upload date:
- Size: 16.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b0203cac0eb33c43463f1a986c3cc70a448d9d593da75567173f46f64e9213c
|
|
| MD5 |
ada2a480219c72ca840fbe1557b07a98
|
|
| BLAKE2b-256 |
8c49ae687154c2cfe623e273143000b81dbd3901d29e13ef30155f1652c18e7c
|
Provenance
The following attestation bundles were made for flake8_annotations-3.2.0-py3-none-any.whl:
Publisher:
pypi_release.yml on sco1/flake8-annotations
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
flake8_annotations-3.2.0-py3-none-any.whl -
Subject digest:
2b0203cac0eb33c43463f1a986c3cc70a448d9d593da75567173f46f64e9213c - Sigstore transparency entry: 597911327
- Sigstore integration time:
-
Permalink:
sco1/flake8-annotations@9f4dcad3f47c086d12958fe2f18776c324a38a65 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/sco1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi_release.yml@9f4dcad3f47c086d12958fe2f18776c324a38a65 -
Trigger Event:
release
-
Statement type: