类型双变性 (PLC0131)
源自 Pylint 代码检查工具。
作用
检查 TypeVar 和 ParamSpec 的定义,其中类型既是协变的又是逆变的。
为什么这不好?
默认情况下,Python 的泛型类型是不变的,但可以通过 covariant 和 contravariant 关键字参数标记为协变或逆变。 虽然 API 允许您将类型标记为既是协变的又是逆变的,但类型系统不支持此操作,应避免这样做。
相反,将类型的变性更改为协变、逆变或不变。 如果您想描述协变和逆变,请考虑使用两个单独的类型参数。
背景: “不变”泛型类型只接受与类型参数完全匹配的值; 例如,list[Dog] 只接受 list[Dog],不接受 list[Animal](超类)或 list[Bulldog](子类)。 这是 Python 泛型类型的默认行为。
“协变”泛型类型接受类型参数的子类; 例如,Sequence[Animal] 接受 Sequence[Dog]。“逆变”泛型类型接受类型参数的超类; 例如,Callable[Dog] 接受 Callable[Animal]。
示例
建议改为
from typing import TypeVar
T_co = TypeVar("T_co", covariant=True)
T_contra = TypeVar("T_contra", contravariant=True)