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.

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?

Tags:  , ,

Answer

  1. Avatar for 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 clase Sub antes de llamar a la función do_something_with_sub():

    sub_instance = get_base_instance(*args)
    if isinstance(sub_instance, Sub):
        do_something_with_sub(sub_instance)
    else:
        raise TypeError("Se esperaba una instancia de Sub, se obtuvo una instancia de {}".format(type(sub_instance)))
    

    De esta manera, si get_base_instance() devuelve una instancia de la clase Base en lugar de Sub, se generará un TypeError 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 tipo Sub:

    sub_instance = get_base_instance(*args)
    cast_sub_instance = cast(Sub, sub_instance)
    do_something_with_sub(cast_sub_instance)
    

    Esto convertirá explícitamente el tipo de sub_instance a Sub, lo cual debería suprimir la advertencia del IDE. Sin embargo, si sub_instance no es realmente una instancia de Sub, aún se generará un TypeError en tiempo de ejecución.

Comments are closed.