簡體   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