跳到内容

non-pep695-generic-function (UP047)

源自 pyupgrade linter。

修复总是可用的。

作用

检查泛型函数中是否使用了独立的类型变量和参数规范。

为什么这不好?

Python 3.12 通过 PEP 695 引入了特殊的类型参数语法来定义泛型函数。此语法更易于阅读,并为泛型提供了更清晰的支持。

已知问题

该规则目前跳过嵌套在其他函数或类中的泛型函数,以及那些具有包含 PEP 696 中引入并在 Python 3.13 中实现的 default 参数的类型参数的函数。

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

修复安全性

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

此外,如果规则无法确定参数注释是否对应于类型变量(例如,从另一个模块导入的类型),则它不会将该类型添加到泛型类型参数列表中。 这会导致该函数同时具有旧式类型变量和新式泛型类型参数,这将受到类型检查器的拒绝。

示例

from typing import TypeVar

T = TypeVar("T")


def generic_function(var: T) -> T:
    return var

建议改为

def generic_function[T](var: T) -> T:
    return var

另请参阅

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

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

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