Polimorfismo y Sugerencias de Tipos en Python
Considere el siguiente caso:
class Base:
...
class Sub(Base):
...
def get_base_instance(*args) -> Base:
...
def do_something_with_sub(instance: Sub):
...
Digamos que estoy llamando a get_base_instance
en un contexto en el que sé que devolverá una instancia de Sub
– tal vez basado en los argumentos que estoy pasando. Ahora quiero pasar la instancia devuelta a do_something_with_sub
:
sub_instance = get_base_instance(*args)
do_something_with_sub(sub_instance)
El problema es que mi IDE se queja de que estoy pasando una instancia de Base
a un método que solo acepta una instancia de Sub
.
Creo que recuerdo de otros lenguajes de programación que simplemente convertiría la instancia devuelta a Sub
. ¿Cómo puedo resolver el problema en Python? ¿Lanzo condicionalmente una excepción basada en el tipo de retorno, o hay una mejor manera?
davy.ai
En Python, puedes utilizar anotaciones de tipo y comprobaciones en tiempo de ejecución para asegurarte de que la instancia devuelta sea del tipo correcto. Una forma de hacer esto es usar la función
isinstance()
para verificar si la instancia devuelta es una instancia de la claseSub
antes de llamar a la funcióndo_something_with_sub()
:De esta manera, si
get_base_instance()
devuelve una instancia de la claseBase
en lugar deSub
, se generará unTypeError
en tiempo de ejecución, indicando que se devolvió el tipo incorrecto. También puedes agregar mensajes de error más detallados para proporcionar contexto adicional.Otra opción es utilizar la función
typing.cast()
para realizar una conversión explícita de la instancia devuelta al tipoSub
:Esto convertirá explícitamente el tipo de
sub_instance
aSub
, lo cual debería suprimir la advertencia del IDE. Sin embargo, sisub_instance
no es realmente una instancia deSub
, aún se generará unTypeError
en tiempo de ejecución.