跳到内容

implicit-optional (RUF013)

v0.0.273 版本中添加 · 相关议题 · 查看源码

有时提供修复。

作用

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

如果 lint.future-annotations 设置为 true,且在 Python 3.10 之前的版本中使用 | 运算符可行,则会自动添加 from __future__ import annotations

为什么这不好?

隐式 OptionalPEP 484 所禁止。它会导致混淆,且与类型系统的其余部分不一致。

建议使用 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 导入

from __future__ import annotations


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

局限性

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

Text = str | bytes


def foo(arg: Text = None):
    pass

Options (选项)

修复安全性

此修复程序始终被标记为不安全,因为它可能会改变依赖于类型提示的代码行为,并且它假设默认值始终是恰当的——事实可能并非如此。