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.0.tar.gz (10.6 kB view details)

Uploaded Source

Built Distribution

flake8_typing_only_imports-0.2.0-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

Details for the file flake8-typing-only-imports-0.2.0.tar.gz.

File metadata

  • Download URL: flake8-typing-only-imports-0.2.0.tar.gz
  • Upload date:
  • Size: 10.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.5 CPython/3.9.2 Linux/5.4.0-1040-azure

File hashes

Hashes for flake8-typing-only-imports-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a9d9e8153c6368c1dfb1d844cb54e6ec1db845940596f7e12406768d1c421680
MD5 071cf3cd5c02d9d7569d80189f413f99
BLAKE2b-256 1a32bbb396d8293fb28c53997df04e6bcd32de34031cf24789c0b757a28a6eb0

See more details on using hashes here.

File details

Details for the file flake8_typing_only_imports-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for flake8_typing_only_imports-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5f13860e14c5ad820f5d90048efe21caf48e10c73aca62357f41cfd3b51f1729
MD5 3dc093defbb9242c012eb38402e125cd
BLAKE2b-256 4080ae74c9bd32fd0079665b95f76fdef3724413a76e1d7c05ca17fc1e442273

See more details on using hashes here.

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