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 __future__ import annotations
from typing import List, Dict, Optional
def func(obj: Dict[str, Optional[int]]) -> None: ...
在运行额外的 pyupgrade 规则后
修复安全性
此规则的修复被标记为不安全,因为添加 from __future__ import annotations
可能会更改程序的语义。