gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:02:56 29 4
gpt4 key购买 nike

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

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() 一起使用的此类类的数量太多,因此不想全部更改。

最佳答案

你可以使用 generic protocol做你需要做的事。但需要注意的是,mypy要求protocol函数的返回类型为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*'

关于Python打字,mypy根据类方法返回类型推断返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65558428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com