跳到内容

future-rewritable-type-annotation (FA100) (未来可重写的类型注解)

源自 flake8-future-annotations linter(代码检查器)。

修复总是可用的。

作用

检测缺少 from __future__ import annotations 导入的情况,这些情况是指检测到可以根据 PEP 563 更简洁地编写的类型注解。

为什么这不好?

PEP 585 启用了许多方便的类型注解,例如 list[str] 而不是 List[str]。但是,这些注解仅在 Python 3.9 及更高版本上可用,除非存在 from __future__ import annotations 导入。

类似地,PEP 604 启用了使用 | 运算符进行联合类型,例如 str | None 而不是 Optional[str]。但是,这些注解仅在 Python 3.10 及更高版本上可用,除非存在 from __future__ import annotations 导入。

通过添加 __future__ 导入,pyupgrade 规则可以自动迁移现有代码以使用新语法,即使对于较旧的 Python 版本也是如此。因此,此规则与 pyupgrade 以及 Ruff 的 pyupgrade 规则配合良好。

此规则遵循 target-version 设置。例如,如果您的项目目标是 Python 3.10 及更高版本,则添加 from __future__ import annotations 不会影响您利用 PEP 604 样式的联合类型(例如,将 Optional[str] 转换为 str | None)的能力。因此,如果您的项目目标是 Python 3.9 或更低版本,此规则才会标记此类用法。

示例

from typing import List, Dict, Optional


def func(obj: Dict[str, Optional[int]]) -> None: ...

建议改为

from __future__ import annotations

from typing import List, Dict, Optional


def func(obj: Dict[str, Optional[int]]) -> None: ...

在运行额外的 pyupgrade 规则后

from __future__ import annotations


def func(obj: dict[str, int | None]) -> None: ...

修复安全性

此规则的修复被标记为不安全,因为添加 from __future__ import annotations 可能会更改程序的语义。

Options (选项)