跳到内容

custom-type-var-for-self (PYI019)

源自 flake8-pyi 代码检查器。

有时提供修复。

作用

检查方法是否在其注解中使用了自定义的 TypeVar,而它们可以使用 Self 来代替。

为什么这不好?

虽然语义通常是相同的,但使用 Self 更直观和简洁(根据 PEP 673)比自定义的 TypeVar。 例如,使用 Self 通常可以省略 selfcls 参数上的类型参数。

此检查目前适用于返回 self 的实例方法,返回 cls 实例的类方法,返回 cls 的类方法和 __new__ 方法。

示例

from typing import TypeVar

_S = TypeVar("_S", bound="Foo")

class Foo:
    def __new__(cls: type[_S], *args: str, **kwargs: int) -> _S: ...
    def foo(self: _S, arg: bytes) -> _S: ...
    @classmethod
    def bar(cls: type[_S], arg: int) -> _S: ...

建议改为

from typing import Self

class Foo:
    def __new__(cls, *args: str, **kwargs: int) -> Self: ...
    def foo(self, arg: bytes) -> Self: ...
    @classmethod
    def bar(cls, arg: int) -> Self: ...

修复行为

该修复会将方法头和主体中所有对自定义类型变量的引用替换为对 Self 的引用。 如果模块中尚未导入 Selftyping,该修复还会添加 Self 的导入。 如果您的 target-version 设置为 Python 3.11 或更高版本,则修复会从标准库 typing 模块导入 Self;否则,修复会从第三方 typing_extensions backport 包导入 Self

如果自定义类型变量是 PEP-695 样式的 TypeVar,则该修复还会从方法的 类型参数列表 中删除 TypeVar 声明。 但是,如果类型变量是旧样式的 TypeVar,则此规则的修复不会删除类型变量的声明,因为类型变量仍然可以被其他函数、方法或类使用。 有关清理未使用的私有类型变量的规则,请参见 unused-private-type-var

修复安全性

仅当有可能从您的代码中删除注释时,修复才会被标记为不安全。

Availability(可用性)

由于此规则依赖于 Python 3.11 之前的版本的第三方 typing_extensions 模块,因此如果已通过 lint.typing-extensions linter 选项禁用 typing_extensions 导入,则不会发出其诊断信息,并且不会提供任何修复。

Options (选项)