我想知道为什么这个例子没有通过 mypy 检查:
from typing import Optional, TypeVar
class A:
pass
class B(A):
def __init__(self) -> None:
print("B")
T = TypeVar("T", bound=A)
def foo(x: T) -> Optional[T]:
if type(x) is B:
return B()
return None
mypy 错误:
toy.py:18:16: error: Incompatible return value type (got "B", expected "Optional[T]") [return-value]
Found 1 error in 1 file (checked 1 source file)
B
不是T
的有效类型吗?
这有点奇怪,但我发现下面的内容确实通过了类型检查:
from typing import Optional, TypeVar
class A:
pass
class B(A):
def __init__(self) -> None:
print("B")
T = TypeVar("T", bound=A)
def foo(x: T) -> Optional[T]:
if type(x) is B:
return type(x)() # Here's the modification
return None
将
B
切换为 type(x)
是有效的,因为 type(x)
已被 if 语句缩小。这应该是完全等价的,所以在某种程度上这是类型检查器中的一个错误,但认为解决方法可能会有所帮助。