我正在尝试实现一种类型暗示的事件订阅机制。
侦听器通过传递处理程序函数进行订阅。
subscribe函数接受任何可以处理BaseEvents的方法。
但是,当我缩小childclass的范围时,会得到一个类型警告。
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,并且这种方法不满足Liskov替换,但是由于Python没有接口,我如何“强制”处理程序至少要处理一些扩展BaseEvent的类,而不是字符串呢?