【发布时间】:2022-12-12 11:45:40
【问题描述】:
我有一个父类BaseBlob,它有几个子类LimitedProofId、ProofId、TxId。父类实现一个 deserialize 类方法,该方法应返回其自身的一个实例。
我还有一个 Delegation 类,它接受一个 LimitedProofId。我特别想要我的如果我错误地传递了 BaseBlob 的另一个子实例,例如 ProofId 或 TxId,则会出错。
class BaseBlob:
__init__(self, data: bytes):
self.data = data
@classmethod
deserialize(class, stream: BytesIO) -> BaseBlob:
return cls(stream.read(32))
class LimitedProofId(BaseBlob):
pass
class TxId(BaseBlob):
pass
class Delegation:
def __init__(self, ltd_id: LimitedProofId):
self.ltd_id = ltd_id
def deserialize(self, stream: BytesIO) -> Delegation:
ltd_id = LimitedProofId.deserialize(stream)
return Delegation(ltd_id)
我的显示此代码的错误,因为如果认为 LimitedProofId.deserialize 是 BaseBlob。
error: Argument 1 to "Delegation" has incompatible type "BaseBlob"; expected "LimitedProofId" [arg-type]
我已经看到类似问题的答案,这些问题使用 T = TypeVar('T', bound='BaseBlob') 实现允许子类的类型注释,但如果我这样做,我需要为 BaseBlob.deserialize 的返回类型和 @ 的第一个参数指定 T 987654338@,这违背了我对后者类型安全的目的。
有没有办法实现我想做的事情,而不必在所有子类上重新实现deserialize?
【问题讨论】:
标签: python type-hinting mypy