Python 重写超类型的协同例程时,如何使用mypy?
有一个类扩展另一个类并重写返回迭代器的协同例程:Python 重写超类型的协同例程时,如何使用mypy?,python,mypy,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 "
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"
,所以我不确定什么是正确的方法
使用ABC类无法解决此问题:
class Repository(metaclass=ABCMeta):
@abstractmethod
async def run(self, query: Query) -> AsyncIterator[int]:
这要归功于:
我认为您不应该让协议函数async def,而是
def。从概念上讲,异步生成器是返回
AsyncIterator或更准确地说,AsyncGenerator。而是一个异步的def
不带yield的函数返回其声明的任何内容的等待值
返回类型为,所以mypy就是这样解释协议的
因此,使用def run更改异步def run是可行的。找到它的原因是:
我认为您不应该让协议函数async def,而是
def。从概念上讲,异步生成器是返回
AsyncIterator或更准确地说,AsyncGenerator。而是一个异步的def
不带yield的函数返回其声明的任何内容的等待值
返回类型为,所以mypy就是这样解释协议的
因此,使用def run更改异步def run是可行的