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.

¿Puede sobrecargar la pista de tipos de retorno para un método en función del argumento pasado al constructor?

Digamos que tengo una clase como esta:

clase miclase:
    def __init__ (self, param1: Tuple[str,...], param2: bool) -> None:
        self.miembro1 = param1
        self.miembro2 = param2
        self.miembro3 = 10

def gimmie(self) -> int | Tuple[str,...]:
    return self.miembro1 if self.miembro2 else self.miembro3

¿Hay alguna manera de asegurar que la devolución de gimmie no sea del tipo int | Tuple[str,...], sino que sea un int o Tuple[str,...] en su lugar?

Edit:

Hay un par de respuestas que involucran acrobacias significativas para hacer esto, cuando lo que realmente estaba buscando era hacer un “cast” de la devolución. Cada una de esas respuestas comenta sobre un “olor a código” debido a esto.

El problema es simplemente que construyo un objeto con un indicador y uno de los métodos devuelve 1 de 2 tipos según ese indicador. Si eso es un diseño deficiente, ¿cuál sería la forma “correcta” de hacerlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar Union[int, Tuple[str, ...]] en lugar de int | Tuple[str, ...] en la sugerencia de tipo del método gimmie para asegurarte de que el tipo de retorno sea either un int o una Tuple[str, ...]. El código actualizado se vería así:

    from typing import Tuple, Union
    
    class myclass:
        def __init__(self, param1: Tuple[str, ...], param2: bool) -> None:
            self.member1 = param1
            self.member2 = param2
            self.member3 = 10
    
        def gimmie(self) -> Union[int, Tuple[str, ...]]:
            return self.member1 if self.member2 else self.member3
    

    El uso de Union[int, Tuple[str, ...]] te permite especificar una unión de tipos que el valor de retorno puede ser, en lugar de usar el operador |, lo cual crea un tipo que representa la combinación de los dos tipos.

Comments are closed.