Я пытаюсь написать небольшой класс 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 кажется, что миксин должен подкласс 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'
Я не знаю, что не так: (