Я пытаюсь реализовать механизм подписки на события с подсказкой типа.
Слушатель подписывается, передавая функцию-обработчик. Функция подписки принимает любой метод, который может обрабатывать BaseEvents.
Однако, когда я сужаю дочерний класс, я получаю предупреждение типа.
from typing import Callable
class BaseEvent:
pass
class ChildEvent(BaseEvent):
pass
class Listener:
def __init__(self):
# Expected type '(BaseEvent) -> None', got '(event: ChildEvent) -> None' instead
self.subscribe(handler=self.handler)
pass
def subscribe(self, handler: Callable[[BaseEvent], None]):
pass
def handler(self, event: ChildEvent):
pass
Я понимаю, что для "контракта" требуется обработчик для принятия любого BaseEvent, и что этот подход не удовлетворяет подстановке Лискова, но, поскольку Python не имеет интерфейсов, как я могу "принудить", что обработчик будет по крайней мере обрабатывать некоторые классы, расширяющие BaseEvent а не строки например?