Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重写超类型的协同例程时,如何使用mypy?_Python_Mypy - Fatal编程技术网

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是可行的