跳到内容

implicit-optional (RUF013)

有时提供修复。

作用

检查类型注释中是否使用了隐式 Optional,当默认参数值为 None 时。

为什么这不好?

PEP 484 禁止使用隐式 Optional。它令人困惑,并且与类型系统的其余部分不一致。

建议使用 Optional[T] 代替。对于 Python 3.10 及更高版本,您也可以使用 T | None

示例

def foo(arg: int = None):
    pass

建议改为

from typing import Optional


def foo(arg: Optional[int] = None):
    pass

或者,对于 Python 3.10 及更高版本

def foo(arg: int | None = None):
    pass

如果您想在 Python 3.9 及更早版本中使用 | 运算符,可以使用 future imports

from __future__ import annotations


def foo(arg: int | None = None):
    pass

限制

不支持类型别名,可能会导致误报。例如,以下代码不会被标记

Text = str | bytes


def foo(arg: Text = None):
    pass

Options (选项)

预览

启用 [preview] 后,如果 lint.future-annotations 设置为 true,则如果这样做可以在 Python 3.10 之前的版本上使用 | 运算符,则将添加 from __future__ import annotations

修复安全性

此修复始终标记为不安全,因为它可能会更改依赖于类型提示的代码的行为,并且它假定默认值始终是合适的——情况可能并非总是如此。