Python 使用Mypy在类中键入dict mixin

Python 使用Mypy在类中键入dict mixin,python,dictionary,multiple-inheritance,mixins,mypy,Python,Dictionary,Multiple Inheritance,Mixins,Mypy,我正在尝试编写一个小的mixin类来处理一些桥接集和可变映射类型:我希望映射类型能够接收一些对象(字节),对它们进行散列,并存储它们,这样它们就可以通过散列访问 下面是将这门课与标准的dict混合使用的一个工作版本: 从hashlib导入blake2b HashingMixin类: def添加(自我,内容): digest=blake2b(内容).hexdigest() 自我[摘要]=内容 类HashingDict(dict,HashingMixin): 通过 但是,我不知道如何添加类型注释

我正在尝试编写一个小的mixin类来处理一些桥接集和可变映射类型:我希望映射类型能够接收一些对象(字节),对它们进行散列,并存储它们,这样它们就可以通过散列访问

下面是将这门课与标准的
dict
混合使用的一个工作版本:

从hashlib导入blake2b
HashingMixin类:
def添加(自我,内容):
digest=blake2b(内容).hexdigest()
自我[摘要]=内容
类HashingDict(dict,HashingMixin):
通过
但是,我不知道如何添加类型注释

看起来mixin必须子类化
abc.abc
abc.abstractmethod
——定义它期望调用的所有方法,因此我的镜头如下:

导入abc
从hashlib导入blake2b
从键入导入Dict
HashingMixin类(abc.abc):
def添加(自身,内容:字节)->无:
digest=blake2b(内容).hexdigest()
自我[摘要]=内容
@抽象方法
def uu getitem(self,key:str)->字节:
引发未实现的错误
@抽象方法
def\uuuu setitem(self,key:str,content:bytes)->无:
引发未实现的错误
类HashingDict(Dict[str,bytes],HashingMixin):
通过
然后,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'

我不知道怎么了:(

这似乎是mypy中的一个bug——请参见mypy用于分析使用多重继承的类的MRO的代码。简言之,mypy错误地完成了忽略您使用具体值参数化了
Dict
,而是像使用
Dict
一样分析代码

我相信这可能是问题追踪者中最相关的问题:根本原因是相同的

在修复该错误之前,您可以通过向任何有错误的行添加
#type:ignore
来抑制mypy在该行上生成的错误。因此,在您的情况下,您可以执行以下操作:

导入abc
从hashlib导入blake2b
从键入导入Dict
HashingMixin类(abc.abc):
def添加(自身,内容:字节)->无:
digest=blake2b(内容).hexdigest()
自我[摘要]=内容
@抽象方法
def uu getitem(self,key:str)->字节:
引发未实现的错误
@抽象方法
def\uuuu setitem(self,key:str,content:bytes)->无:
引发未实现的错误
类HashingDict(Dict[str,bytes],HashingMixin):#类型:ignore
通过
如果您决定采用这种方法,我建议您也留下一条附加注释,说明为什么要抑制这些错误,并使用
--warn unused ignores
标志运行mypy

前者是为了您的代码的任何未来读者的利益;后者将在mypy report遇到
#类型:ignore
时发出警告,该类型实际上不抑制任何错误,因此可以安全地删除


(当然,您也可以尝试自己提供修复!)

hmm问题已解决,您的mypy源链接已断开(因为您已链接到master!)