Как я могу использовать mypy при переопределении сопрограмм супертипов? - PullRequest
0 голосов
/ 09 июля 2019

Существует один класс, который расширяет другой и переопределяет сопрограмму, которая возвращает итератор:

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]:

1 Ответ

0 голосов
/ 09 июля 2019

Нашел благодаря этой проблеме :

Я думаю, вы не должны делать функцию протокола async def, а просто отсроченный Концептуально асинхронный генератор является вызываемым, который возвращает AsyncIterator (или, точнее, AsyncGenerator). Но асинхронная защита функция без выхода возвращает Awaitable того, что объявлено тип возвращаемого значения, так что mypy интерпретирует ваш протокол.

Итак, изменение async def run на def run работает.

...