考虑以下示例:
import typing
T = typing.TypeVar('T', bound=typing.Union[int, bool, str])
class Test(typing.Generic[T]):
def __init__(self, v: T) -> None:
self.v = v
self.t = type(v)
def parse(self, s: str) -> T:
if self.t == int:
return int(s, base=0)
elif self.t == bool:
return s.lower() != 'false'
elif self.t == str:
return s
else:
raise NotImplementedError()
mypy 抱怨:
test.py:13: error: Incompatible return value type (got "int", expected "T")
test.py:15: error: Incompatible return value type (got "bool", expected "T")
test.py:17: error: Incompatible return value type (got "str", expected "T")
如何重写代码,以便 mypy 理解 T 在本例中是 int/bool/str?
import typing
T = typing.TypeVar('T', int, bool, str)
class Test(typing.Generic[T]):
def __init__(self, v: T) -> None:
self.v: T = v # Annotation.
self.t: typing.Type[T] = type(v) # Annotation.
def parse(self, s: str) -> T:
if self.t == int:
return typing.cast(T, int(s, base=0))
elif self.t == bool:
return typing.cast(T, s.lower() != 'false')
elif self.t == str:
return typing.cast(T, s)
else:
raise NotImplementedError()
在 init 方法中为变量 v 和 t 键入注释:
在init方法中,为变量v和t添加了类型注释,以明确指示它们的类型。这样 MyPy 就能正确推断类型并检测键入错误。
在解析方法中使用typing.cast:
在parse方法中,您使用writing.cast函数将返回类型执行特定的转换为T。这表明您知道返回类型与T兼容。