类型双变性 (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)