跳到内容

类型双变性 (PLC0131)

源自 Pylint 代码检查工具。

作用

检查 TypeVarParamSpec 的定义,其中类型既是协变的又是逆变的。

为什么这不好?

默认情况下,Python 的泛型类型是不变的,但可以通过 covariantcontravariant 关键字参数标记为协变或逆变。 虽然 API 允许您将类型标记为既是协变的又是逆变的,但类型系统不支持此操作,应避免这样做。

相反,将类型的变性更改为协变、逆变或不变。 如果您想描述协变和逆变,请考虑使用两个单独的类型参数。

背景: “不变”泛型类型只接受与类型参数完全匹配的值; 例如,list[Dog] 只接受 list[Dog],不接受 list[Animal](超类)或 list[Bulldog](子类)。 这是 Python 泛型类型的默认行为。

“协变”泛型类型接受类型参数的子类; 例如,Sequence[Animal] 接受 Sequence[Dog]。“逆变”泛型类型接受类型参数的超类; 例如,Callable[Dog] 接受 Callable[Animal]

示例

from typing import TypeVar

T = TypeVar("T", covariant=True, contravariant=True)

建议改为

from typing import TypeVar

T_co = TypeVar("T_co", covariant=True)
T_contra = TypeVar("T_contra", contravariant=True)

参考