【发布时间】:2019-04-12 17:57:58
【问题描述】:
我正在尝试编写一个小的 mixin 类来在某种程度上桥接 Set 和 MutableMapping 类型:我希望映射类型能够接收一些对象(字节),对它们进行哈希处理并存储它们,因此它们可以被访问哈希。
这是将此类与标准 dict 混合的工作版本:
from hashlib import blake2b
class HashingMixin:
def add(self, content):
digest = blake2b(content).hexdigest()
self[digest] = content
class HashingDict(dict, HashingMixin):
pass
但是我不知道如何添加类型注释。
从 https://github.com/python/mypy/issues/1996 看来,mixin 必须继承 abc.ABC 和 abc.abstractmethod - 定义它期望调用的所有方法,所以这是我的想法:
import abc
from hashlib import blake2b
from typing import Dict
class HashingMixin(abc.ABC):
def add(self, content: bytes) -> None:
digest = blake2b(content).hexdigest()
self[digest] = content
@abc.abstractmethod
def __getitem__(self, key: str) -> bytes:
raise NotImplementedError
@abc.abstractmethod
def __setitem__(self, key: str, content: bytes) -> None:
raise NotImplementedError
class HashingDict(Dict[str, bytes], HashingMixin):
pass
然后 Mypy 抱怨 HashingDict 定义:
error: Definition of "__getitem__" in base class "dict" is incompatible with definition in base class "HashingMixin"
error: Definition of "__setitem__" in base class "dict" is incompatible with definition in base class "HashingMixin"
error: Definition of "__setitem__" in base class "MutableMapping" is incompatible with definition in base class "HashingMixin"
error: Definition of "__getitem__" in base class "Mapping" is incompatible with definition in base class "HashingMixin"
揭示类型:
reveal_type(HashingMixin.__getitem__)
reveal_type(HashingDict.__getitem__)
产量:
error: Revealed type is 'def (coup.content.HashingMixin, builtins.str) -> builtins.bytes'
error: Revealed type is 'def (builtins.dict[_KT`1, _VT`2], _KT`1) -> _VT`2'
我不知道怎么了:(
【问题讨论】:
标签: python dictionary multiple-inheritance mixins mypy