跳到内容

non-pep604-annotation-optional (UP045)

源自 pyupgrade linter。

有时提供修复。

作用

检查可以基于 PEP 604 语法重写的 typing.Optional 注释。

为什么这不好?

PEP 604 引入了一种基于 | 运算符的联合类型注释的新语法。这种语法比之前的 typing.Optional 语法更简洁易读。

当目标 Python 版本为 3.10 或更高版本时,此规则启用(参见:target-version)。默认情况下,如果存在 from __future__ import annotations,它会为更早的 Python 版本启用,因为 __future__ 注释不会在运行时求值。如果您的代码依赖于运行时类型注释(直接或通过像 Pydantic 这样的库),您可以通过将 lint.pyupgrade.keep-runtime-typing 设置为 true 来禁用 Python 3.10 之前版本上的此行为。

示例

from typing import Optional

foo: Optional[int] = None

建议改为

foo: int | None = None

修复安全性

此规则的修复被标记为不安全,因为它可能会导致在 Python 3.10 之前的 Python 版本上,使用依赖于运行时类型注释的库(如 Pydantic)时出现运行时错误。它也可能导致类型不支持 | 运算符的不寻常且可能不正确的类型注释中的运行时错误。

Options (选项)