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.

Sobrecarga para abarcar todo en las anotaciones de tipo en Python

El siguiente código falla mypy con el error: “Las firmas de las funciones sobrecargadas 1 y 2 se superponen con tipos de retorno incompatibles”.

@overload
def test_overload(x: str) -> str: ...

@overload
def test_overload(x: object) -> int: ...

def test_overload(x) -> Union[str, int]:
    if isinstance(x, str):
        return x
    else:
        return 1

Lo que intento expresar es: “Esta función toma un objeto Python arbitrario. Si ese objeto es una cadena, devuelve una cadena. Si es de cualquier otro tipo, devuelve un entero. Tengan en cuenta que este ejemplo en particular es un caso artificial para representar el caso general.

¿Es posible expresarlo con sobrecargas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible expresarlo mediante sobrecargas. Sin embargo, la implementación actual en el código proporcionado es incorrecta, lo que resulta en el error. Para solucionar el error, debemos modificar las anotaciones de tipo de la siguiente manera:

    from typing import overload, Union
    
    @overload
    def test_overload(x: str) -> str: ...
    
    @overload
    def test_overload(x: object) -> int: ...
    
    def test_overload(x: Union[str, object]) -> Union[str, int]:
        if isinstance(x, str):
            return x
        else:
            return 1
    

    Aquí, hemos agregado una anotación de tipo Union[str, object] para el argumento x en la definición de la función, para indicar que puede ser tanto una cadena como cualquier otro objeto. También hemos agregado anotaciones de tipo para los tipos de retorno de ambas funciones sobrecargadas, como str e int, respectivamente.

    Con estas modificaciones, la función debería pasar mypy y expresar correctamente el comportamiento deseado.

Comments are closed.