#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: ...