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
导入,则不会发出其诊断信息,并且不会提供任何修复。