当重写超类型协程时如何使用mypy?

时间:2019-07-09 07:21:21

标签: python mypy

有一个类扩展了另一个类并覆盖了返回迭代器的协程:

class Repository:
     async def run(self, query: Query) -> AsyncIterator[int]:
...

class MyRepository(Repository):
     async def run(self, query: Query) -> AsyncIterator[int]:
...

运行mypy返回此错误:

error: Return type "AsyncIterator[int]" of "run" incompatible with return type "Coroutine[Any, Any, AsyncIterator[int]]" in supertype "Repository"

Coroutines are typed like normal functions,所以我不确定哪种方法正确。

使用ABC类无法解决该问题:

class Repository(metaclass=ABCMeta):
    @abstractmethod
    async def run(self, query: Query) -> AsyncIterator[int]:

1 个答案:

答案 0 :(得分:0)

感谢this issue找到了它:

  

我认为您不应该使协议功能异步定义,而只是   def。从概念上讲,异步生成器是可调用的,可返回   AsyncIterator(或更准确地说,是AsyncGenerator)。但是异步def   没有yield的函数将返回其声明的Awaitable   返回类型是,所以mypy就是这样解释您的协议的。

因此,用async def run更改def run是可行的。