跳到内容

non-pep695-generic-class (UP046)

源自 pyupgrade linter。

有时提供修复。

作用

检查在泛型类中使用独立的类型变量和参数规范。

为什么这不好?

Python 3.12 通过 PEP 695 引入了特殊的类型参数语法,用于定义泛型类。这种语法更易于阅读,并为泛型提供了更简洁的支持。

已知问题

该规则目前跳过嵌套在其他函数或类中的泛型类。它还会跳过 Python 3.13 中实现的 PEP 696 中引入的带有 default 参数的类型参数。

只有当类定义中的所有泛型类型都在当前模块中定义时,此规则才能提供修复。对于外部类型参数,会发出诊断,但不提供建议的修复。

并非所有类型检查器都完全支持 PEP 695,因此即使此规则建议的有效修复也可能导致类型检查 失败

修复安全性

此修复被标记为不安全,因为 PEP 695 对类型参数使用推断的变异,而不是 TypeVar 变量使用的 covariantcontravariant 关键字。因此,将 TypeVar 变量替换为内联类型参数可能会改变其变异。

示例

from typing import Generic, TypeVar

T = TypeVar("T")


class GenericClass(Generic[T]):
    var: T

建议改为

class GenericClass[T]:
    var: T

另请参阅

此规则替换类中的独立类型变量,但即使在修复后未使用,也不会删除相应的类型变量。有关清理未使用的私有类型变量的规则,请参阅 unused-private-type-var

此规则不会重命名私有类型变量以删除前导下划线,即使新的类型参数的范围仅限于其关联的类。有关更新这些名称的规则,请参阅 private-type-parameter

此规则将正确处理具有多个基类的类,只要单个 Generic 基类位于参数列表的末尾,如 generic-not-last-base-class 所检查的那样。如果在最后一个位置之外找到 Generic 基类,则会发出诊断,但不提供建议的修复。

此规则仅适用于泛型类,不包括泛型函数。有关函数版本,请参阅 non-pep695-generic-function