這個答案似乎不適用于泛型。Mypy 在檢查以下代碼時抱怨“錯誤:缺少泛型 A 的型別引數”。我曾嘗試使用'A[T]'TypeVar 但 mypy 說“錯誤:型別變數 T 未系結”。我也嘗試過使用AnyA[T]作為回傳型別,get但這會產生兩條錯誤訊息,已知的“錯誤:缺少泛型 A 的型別引數”和新的錯誤訊息“型別變數 AnyA 與引數一起使用”。
如何get正確指定回傳型別?
import typing
T = typing.TypeVar('T')
AnyA = typing.TypeVar('AnyA', bound='A')
class A(typing.Generic[T]):
def __init__(self, val: T) -> None:
self.val = val
def get(self: AnyA) -> AnyA:
return self
class B(A[T]):
def is_int(self) -> bool:
return isinstance(self.val, int)
if __name__ == '__main__':
b = B(42)
print(b.get().is_int())
uj5u.com熱心網友回復:
我知道這里有三種打字方式:
宣告內在自我型別
這種方法在mypy檔案中進行了描述,請參閱Precise typing of Alternative constructors。
class A(typing.Generic[T]):
_Self = typing.TypeVar('_Self', bound='A[T]')
def __init__(self, val: T) -> None:
self.val = val
def get(self: _Self) -> _Self:
return self
但是請注意,這是mypy特定的東西,可能不適用于其他檢查器。例如pyre,還不支持內部自我型別。
使用_typeshed.Self
這節省了宣告自定義型別的樣板檔案,但需要從 typeshed 進行有點模糊的匯入,這將在運行時失敗。因此它必須被包裹typing.TYPE_CHECKING:
from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
from _typeshed import Self
else:
Self = Any
class A(typing.Generic[T]):
def __init__(self, val: T) -> None:
self.val = val
def get(self: Self) -> Self:
return self
_typeshed.Self最初是為了在自定義存根中使用而創建的,但也適用于行內型別。
Python 3.11 及更高版本:typing.Self
最近引入的PEP 673添加Self到 stdlib,因此從 Python 3.11 開始,將能夠使用它:
from typing import Self
class A(typing.Generic[T]):
def __init__(self, val: T) -> None:
self.val = val
def get(self: Self) -> Self:
return self
到目前為止,這還不支持mypy,但例如pyright從版本 1.1.184 開始。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480199.html
上一篇:不能宣布歧視聯盟的成員
下一篇:從元組內容推斷型別
