Как исправить ошибку mypy, несовместимую с типом возврата, не используя Union

#python #mypy #python-typing

#питон #майпи #набор текста на python

Вопрос:

В настоящее время я работаю над оболочкой API, которая также будет поддерживать асинхронность.
Поэтому я решил создать асинхронный клиент, унаследовав его от асинхронного обычного клиента.

 # Test  import requests import aiohttp   class Client:  def request(self, url: str) -gt; requests.Response:  ...   class AsyncClient(Client):  def request(self, url: str) -gt; aiohttp.ClientResponse:  ...  

Затем mypy выдал мне следующую ошибку.
error: Return type "ClientResponse" of "request" incompatible with return type "Response" in supertype "Client"
Я знаю , что могу использовать Union , но я не хочу, чтобы import асинхронный клиент включался в код клиента синхронизации, потому что я хочу, чтобы асинхронный клиент был опцией, которую я могу использовать, если сделаю следующее pip3 install myapiwrapper[async] .
Есть ли способ каким-либо образом устранить эту ошибку?

Ответ №1:

Я решил этот вопрос с помощью Generic .

 # Test  from typing import TypeVar, Generic  import requests import aiohttp   ResponseT = TypeVar("ResponseT")   class BaseClient(Generic[ResponseT]):  def request(self, url: str) -gt; ResponseT:  ...   class Client(BaseClient[requests.Response]):  def request(self, url: str) -gt; ResponseT:  ...   class AsyncClient(BaseClient[aiohttp.ClientResponse]):  def request(self, url: str) -gt; ResponseT:  ...