Python类型,mypy根据类方法返回类型推断返回类型



考虑一下当我有不同的类实现相同的方法,同时返回不同的类型时的情况。

class A:
def method(self) -> float:
return 3.14
class B:
def method(self) -> str:
return 'a string'
def do_method(x):
return x.method()
r = do_method(A())
reveal_type(r)  # Revealed type is 'Any'

Mypy无法推断函数do_method()的确切返回类型,这取决于其参数x。我该如何帮助Mypy实现这一目标?

注意:还请考虑到我想在函数do_method()中使用的此类的数量太多,所以不想全部更改它们。

您可以使用通用协议来完成您需要的操作。但需要注意的是,当mypy是TypeVar时,它需要协议函数的返回类型的协方差,所以我们必须用covariant=True明确地声明这一点,否则默认情况下该变量被视为不变量。

一个方法的协变返回类型是一个可以用";较窄的";当方法在子类中被重写时,键入。

from typing import TypeVar, Protocol
T = TypeVar('T', covariant=True)
class Proto(Protocol[T]):
def method(self) -> T: ...

class A:
def method(self) -> float:
return 3.14

class B:
def method(self) -> str:
return 'a string'

def do_method(x: Proto[T]) -> T:
return x.method()

r1 = do_method(A())
reveal_type(r1)  # Revealed type is 'builtins.float*'
r2 = do_method(B())
reveal_type(r2)  # Revealed type is 'builtins.str*'

最新更新