繁体   English   中英

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

[英]Python typing, mypy infer return type based on class method return type

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

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 无法推断 function do_method()的确切返回类型,这取决于其参数x 我如何帮助 Mypy 实现这一目标?

注意:还请考虑我想与 function do_method()一起使用的此类数量太多,因此不想全部更改。

您可以使用通用协议来做您需要的事情。 但需要注意的是,mypy 需要协议的 function 的返回类型为TypeVar时的协方差,所以我们必须通过covariant=True显式地 state ,否则默认情况下该变量被视为不变量。

方法的协变返回类型是在子类中重写该方法时可以用“更窄”类型替换的类型。

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*'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM