es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de resolver este error sin utilizar Union. Puedes utilizar el decorador typing.overload para definir múltiples versiones del método request con diferentes tipos de retorno. Así es cómo puedes hacerlo:

    # Prueba
    
    import requests
    import aiohttp
    from typing import overload
    
    
    class Cliente:
        @overload
        def request(self, url: str) -> requests.Response:
            ...
    
        @overload
        def request(self, url: str) -> aiohttp.ClientResponse:
            ...
    
    
    class ClienteAsincrono(Cliente):
        def request(self, url: str) -> aiohttp.ClientResponse:
            ...
    
    
    class ClienteSincrono(Cliente):
        def request(self, url: str) -> requests.Response:
            ...
    

    Ahora, puedes definir tanto la versión requests como la versión aiohttp del método request en la clase Cliente utilizando el decorador overload. Esto le indica a mypy que hay diferentes versiones del mismo método con diferentes tipos de retorno.

    Luego, puedes crear las clases ClienteAsincrono y ClienteSincrono que heredan de Cliente e implementan la versión específica del método request para su caso de uso.

    De esta manera, cuando utilizas la clase ClienteAsincrono, mypy sabrá que debe esperar un aiohttp.ClientResponse como tipo de retorno, y cuando utilizas la clase ClienteSincrono, mypy sabrá que debe esperar un requests.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.

Comments are closed.