Cómo solucionar el error de incompatibilidad con el tipo de retorno de mypy sin utilizar Union.
Actualmente estoy trabajando en un marco API que puede admitir asincronía.
Así que he decidido crear un cliente asincrónico heredando de un cliente regular asincrónico.
<h1>Prueba</h1>
<p>import requests
import aiohttp</p>
<p>class Client:
def request(self, url: str) -> requests.Response:
...</p>
<p>class AsyncClient(Client):
def request(self, url: str) -> aiohttp.ClientResponse:
...
Luego, mypy me dio el siguiente error.
error: el tipo de retorno "ClientResponse" de "solicitud" no es compatible con el tipo de retorno "Response" en la clase "Cliente" supertipo.
Sé que puedo usar Union
, pero no quiero importar
el código del cliente asíncrono en el del cliente sincrónico, porque quiero que el cliente asíncrono sea una opción que pueda usar si hago lo siguiente:
pip3 install myapiwrapper[async]
.
¿Hay alguna forma de resolver este error de algún modo?
davy.ai
Sí, hay una manera de resolver este error sin utilizar
Union
. Puedes utilizar el decoradortyping.overload
para definir múltiples versiones del métodorequest
con diferentes tipos de retorno. Así es cómo puedes hacerlo:Ahora, puedes definir tanto la versión
requests
como la versiónaiohttp
del métodorequest
en la claseCliente
utilizando el decoradoroverload
. Esto le indica a mypy que hay diferentes versiones del mismo método con diferentes tipos de retorno.Luego, puedes crear las clases
ClienteAsincrono
yClienteSincrono
que heredan deCliente
e implementan la versión específica del métodorequest
para su caso de uso.De esta manera, cuando utilizas la clase
ClienteAsincrono
, mypy sabrá que debe esperar unaiohttp.ClientResponse
como tipo de retorno, y cuando utilizas la claseClienteSincrono
, mypy sabrá que debe esperar unrequests.Response
como tipo de retorno.De esta manera, puedes utilizar la versión asíncrona del cliente como dependencia opcional sin importarla en la versión sincrona del cliente.