下面是我遇到的问题的简化示例mypy
。该A.transform
方法采用对象的可迭代对象,转换每个对象(在子类中定义B
,可能还有其他子类)并返回转换对象的可迭代对象。
from typing import Iterable, TypeVar
T = TypeVar('T')
class A:
def transform(self, x: Iterable[T]) -> Iterable[T]:
raise NotImplementedError()
class B(A):
def transform(self, x: Iterable[str]) -> Iterable[str]:
return [x.upper() for x in x]
然而mypy
说:
error: Argument 1 of "transform" incompatible with supertype "A"
error: Return type of "transform" incompatible with supertype "A"
[T]
如果我从中删除A.transform()
,那么错误就会消失。但这似乎是错误的解决方案。
在阅读了covariance 和 contravariance之后,我认为设置
T = TypeVar('T', covariant=True)
可能是一个解决方案,但这会产生相同的错误。
我怎样才能解决这个问题?我考虑过将设计完全装箱并用高阶函数替换 A 类。