代码之家  ›  专栏  ›  技术社区  ›  Bouke Versteegh clauziere

具有对象子参数的函数的类型提示不接受子类

  •  0
  • Bouke Versteegh clauziere  · 技术社区  · 5 年前

    我正在尝试实现一种类型暗示的事件订阅机制。

    侦听器通过传递处理程序函数进行订阅。 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的类,而不是字符串呢?

    0 回复  |  直到 5 年前