簡體   English   中英

Python 輸入 Callable class 屬性

[英]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 類型的decodersdecoders[0]的運行時類型,分配是合法的,但對於decoders[1]的運行時類型是非法的。 擺脫_decodeBytesOptional狀態消除了將None分配給任何對象的_decodeBytes屬性的可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM