Skip to main content

A CLI and pre-commit hook to upgrade the typing annotations syntax to PEP 585 and PEP 604

Project description

fix-future-annotations

A CLI and pre-commit hook to upgrade the typing annotations syntax to PEP 585 and PEP 604.

Upgrade Details

PEP 585 – Type Hinting Generics In Standard Collections

OldNew
typing.Dict[str, int]
List[str]
dict[str, int]
list[str]

PEP 604 – Allow writing union types as X | Y

OldNew
typing.Union[str, int]
Optional[str]
str | int
str | None

PEP 563 – Postponed Evaluation of Annotations

OldNew
def create() -> "Foo": pass
def create() -> Foo: pass

Import aliases handling

OldNew
import typing as t
from typing import Tuple as MyTuple

def foo() -> MyTuple[str, t.Optional[int]]:
    pass
from __future__ import annotations

import typing as t

def foo() -> tuple[str, int | None]:
    pass

Full example

OldNew
from typing import Union, Dict, Optional, Tuple

# non-annotation usage will be preserved
MyType = Union[str, int]


def foo() -> Tuple[Dict[str, int], Optional[str]]:
    ...
from __future__ import annotations

from typing import Union

# non-annotation usage will be preserved
MyType = Union[str, int]


def foo() -> tuple[dict[str, int], str | None]:
    ...

Unused import names will be removed, and if from __future__ import annotations is not found in the script, it will be automatically added if the new syntax is being used.

Use as a command line tool

python3 -m pip install -U fix-future-annotations

fix-future-annotations my_script.py

Use as pre-commit hook

Add the following to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/frostming/fix-future-annotations
    rev: x.y.z  # a released version tag
    hooks:
      - id: fix-future-annotations

Configurations

fix-future-annotations can be configured via pyproject.toml. Here is an example:

[tool.fix_future_annotations]
exclude_files = [  # regex patterns to exclude files
    'tests/.*',
    'docs/.*',
]

exclude_lines = [  # regex patterns to exclude lines
    '# ffa: ignore',   # if a line ends with this comment, the whole *block* will be excluded
    'class .+\(BaseModel\):'  # classes that inherit from `BaseModel` will be excluded
]

License

This work is distributed under MIT license.

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

fix-future-annotations-0.5.0.tar.gz (11.3 kB view hashes)

Uploaded Source

Built Distribution

fix_future_annotations-0.5.0-py3-none-any.whl (10.1 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