Skip to main content

flake8-annotations

PyPI - Python Version PyPI PyPI - License pre-commit.ci status

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:

  1. See: PEP 484 and PEP 563 for suggestions on annotating self and cls arguments
  2. See: Dynamic Typing Caveats
  3. Only function declarations are considered by this plugin; type annotations in function/module bodies are not checked
  4. Common pitfall: the use of ignore will 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 return statement, or
  • Explicit return statement(s) all return None (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.singledispatch
  • import functools as <alias>; @<alias>.singledispatch
  • from 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.overload
  • import typing as <alias>; @<alias>.overload
  • from 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 @overload decorator 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: Any
  • import typing; foo: typing.Any
  • import 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.

Metadata

Release files for flake8-annotations 3.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flake8-annotations 3.2.0
File Size Uploaded
flake8_annotations-3.2.0.tar.gz 14.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for flake8-annotations 3.2.0
File Interpreter ABI Platform
flake8_annotations-3.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 31.0 kB

Release files / flake8_annotations-3.2.0.tar.gz

Download URL flake8_annotations-3.2.0.tar.gz
Size 14.2 kB
Tags Source
SHA-256 checksum
How to use checksums
71b52ec85a4ec82a10edfad497fe2b390609c95b2ad7d61cc94704bc88a498a0
BLAKE2b-256 checksum
How to use checksums
99eaf36a8e013154f214715de01d46d98f12a673c7b978533079ac5caf4cbcce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2025.

Transparency log

Release files / flake8_annotations-3.2.0-py3-none-any.whl

Download URL flake8_annotations-3.2.0-py3-none-any.whl
Size 16.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b0203cac0eb33c43463f1a986c3cc70a448d9d593da75567173f46f64e9213c
BLAKE2b-256 checksum
How to use checksums
8c49ae687154c2cfe623e273143000b81dbd3901d29e13ef30155f1652c18e7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

3.2.0 This release

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.9.1

2 release files

2.9.0

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.2

2 release files

2.6.1

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page