有一个类扩展了另一个类并覆盖了返回迭代器的协程:
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]:
答案 0 :(得分:0)
感谢this issue找到了它:
我认为您不应该使协议功能异步定义,而只是 def。从概念上讲,异步生成器是可调用的,可返回 AsyncIterator(或更准确地说,是AsyncGenerator)。但是异步def 没有yield的函数将返回其声明的Awaitable 返回类型是,所以mypy就是这样解释您的协议的。
因此,用async def run
更改def run
是可行的。