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

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: flake8-typing-only-imports-0.2.1.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.1.tar.gz
Algorithm Hash digest
SHA256 dd2b3df42734d5450687f837194cbcd36e563a2faa3d74f8435c858ee96d55c2
MD5 7ad279d0c9988151c89fb100e6b8a810
BLAKE2b-256 e62faa1424f05402d91a8e4ca681ccb496cbb7ce15e6b471882516ac446f7124

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flake8_typing_only_imports-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a41513e54c1b85a60480edd96f78c1fb0a15d8ba59df9ddf1203d9a4f7190519
MD5 24f5203cbd51f9aac4908cc3d12580a9
BLAKE2b-256 ce894bf43cfce9d8f1d25a41736ed3898e359d9b9bdc924ea122be8ee0a42676

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