[英]Python typing Callable class property
我有一個繼承的 class 成員,它是一個可選的可調用對象,我想鍵入提示它。
import typing
class BytesDecoder(typing.Protocol):
def __call__(self,data:bytes)->None: ...
class BaseClass:
_decodeBytes:typing.Optional[BytesDecoder]=None
@typing.final
def decode(self,data:bytes):
if self._decodeBytes is not None:
self._decodeBytes(data)
class DerivedClass(BaseClass):
def _decodeBytes(self,data:bytes)->None:
...
Mypy 抱怨派生的 _decodeBytes 方法:
“_decodeBytes”的簽名與超類型“BaseClass”不兼容
我也試過像BytesDecoder=typing.Callable[[bytes],None]
那樣定義 BytesDecoder,但這樣做是一樣的。
我偶然發現了一種解決方案,盡管它並不理想。 在基礎 class 中,我可以創建一個虛擬的 _decodeBytes() function,然后強行將其粉碎回 None。
class BaseClass:
def _decodeBytes(self,data:bytes)->None: ...
_decodeBytes=None # type: ignore
它很奇怪且不直觀,但它似乎確實使派生類的類型檢查按預期工作。
更好的解決方案可能是使_decodeBytes
必需,但提供一個虛擬實現,其行為與根本不調用它相同。
import typing
class BaseClass:
def _decodeBytes(self, data: bytes) -> None:
pass
@typing.final
def decode(self,data:bytes):
self._decodeBytes(data)
class DerivedClass(BaseClass):
def _decodeBytes(self,data:bytes)->None:
...
最初的問題是mypy
無法驗證以下內容是否安全:
decoders: list[BaseClass] = [BaseClass(), DerivedClass()]
for x in decoders:
x._decodeBytes = None
根據 static 類型的decoders
和decoders[0]
的運行時類型,分配是合法的,但對於decoders[1]
的運行時類型是非法的。 擺脫_decodeBytes
的Optional
狀態消除了將None
分配給任何對象的_decodeBytes
屬性的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.