custom-type-var-for-self (PYI019)
源自 flake8-pyi 代码检查器。
有时提供修复。
作用
检查方法是否在其注解中使用了自定义的 TypeVar,而它们可以使用 Self 来代替。
为什么这不好?
虽然语义通常是相同的,但使用 Self 更直观和简洁(根据 PEP 673)比自定义的 TypeVar。 例如,使用 Self 通常可以省略 self 和 cls 参数上的类型参数。
此检查目前适用于返回 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 的引用。 如果模块中尚未导入 Self 或 typing,该修复还会添加 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 导入,则不会发出其诊断信息,并且不会提供任何修复。