Тип подсказки функции с дочерними аргументами объекта не принимает дочерние классы - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь реализовать механизм подписки на события с подсказкой типа.

Слушатель подписывается, передавая функцию-обработчик. Функция подписки принимает любой метод, который может обрабатывать 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 а не строки например?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...