Skip to main content

A flake8 plugin to flag imports exclusively used for type annotations

Project description

Package version Code coverage Test status Supported Python versions Checked with mypy

flake8-typing-only-imports

Plugin is still a work in progress

Tells you which imports to put inside type-checking blocks.

Codes

Code Description
TYO100 Move import into a type-checking block
TYO101 Move third-party import into a type-checking block
TYO102 Found multiple type checking blocks
TYO200 Add 'from __future__ import annotations' import
TYO201 Annotation does not need to be a string literal
TYO300 Annotation needs to be made into a string literal
TYO301 Annotation does not need to be a string literal

Rationale

TYO100 guards against import cycles . TYO101 applies the same logic, for venv or stdlib imports.

Remaining error codes are there to help manage forward references, either by telling your to use string literals where needed, or by enabling postponed evaluation of annotations. The error code series TYO2XX and TYO3XX should therefore be considered mutually exclusive, as they represent two different ways of managing forward references.

See this excellent stackoverflow answer for a quick explanation of forward references.

Installation

pip install flake8-typing-only-imports

Suggested use

Only enable TYO101 if you're after micro performance gains on start-up.

TYO2XX and TYO3XX are reserved for error codes to help manage forward references. It does not make sense to enable both series, and they should be considered mutually exclusive.

If you're adding this to your project, we would recommend something like this:

select = TYO100, TYO200, TYO200  # or TYO300 and TYO301

ignore = TYO101, TYO300, TYO301  # or TYO200 and TYO201

Examples

Bad code

models/a.py

from models.b import B

class A(Model):
    def foo(self, b: B): ...

models/b.py

from models.a import A

class B(Model):
    def bar(self, a: A): ...

Which will first result in these errors

>> a.py: TYO101: Move third-party import 'models.b.B' into a type-checking block
>> b.py: TYO101: Move third-party import 'models.a.A' into a type-checking block

and consequently trigger these errors if imports are purely moved into type-checking block, without proper forward reference handling

>> a.py: TYO300: Annotation 'B' needs to be made into a string literal
>> b.py: TYO300: Annotation 'A' needs to be made into a string literal

Good code

models/a.py

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from models.b import B

class A(Model):
    def foo(self, b: 'B'): ...

models/b.py

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from models.a import A

class B(Model):
    def bar(self, a: 'A'): ...

As a pre-commit hook

You can run this flake8 plugin as a pre-commit hook:

- repo: https://gitlab.com/pycqa/flake8
  rev: 3.7.8
  hooks:
    - id: flake8
      additional_dependencies: [ flake8-typing-only-imports ]

Supporting the project

Leave a ⭐️  if this project helped you!

Contributions are always welcome 👏

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flake8-typing-only-imports-0.2.2.tar.gz (10.6 kB view hashes)

Uploaded Source

Built Distribution

flake8_typing_only_imports-0.2.2-py3-none-any.whl (10.3 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page