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?
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:
Aquí, hemos agregado una anotación de tipo
Union[str, object]
para el argumentox
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, comostr
eint
, respectivamente.Con estas modificaciones, la función debería pasar
mypy
y expresar correctamente el comportamiento deseado.