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.

Error de mypy: Tipo de valor de retorno incompatible (obtenido “objeto”, esperado “Diccionario[Cualquier cosa, Cualquier cosa]”)

Tengo una clase de python que se ve así:

class TestClass():

    def __init__(self, input_data):
        self.input_data = input_data # siempre 'a' o 'b'

    def test(self) -> dict[int, Any]:
        a = {'a': {1:0, 2:0}, 'b': {2:0, 3:'string'}}
        return a[self.input_data]

Al ejecutar mypy, obtengo el mensaje de error `Incompatible return value type (got "object", expected "Dict[Any, Any]"). ¿Hay alguna manera de resolver este problema?

También obtengo el mismo problema con declaraciones de una sola línea, por ejemplo, si devuelve un entero diferente según una condición y anota el tipo de retorno como int, se genera un mensaje de error que indica que se devuelve un tipo “object”.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, el problema se puede solucionar cambiando la anotación del tipo de retorno del método test a Dict[int, Union[int, str]]. Esto se debe a que los valores del diccionario a pueden ser enteros o cadenas, y necesitamos indicarlo en una pista de tipo. El código refinado sería:

    from typing import Dict, Union
    
    class TestClass():
    
        def __init__(self, input_data: str) -> None:
            self.input_data = input_data #siempre es 'a' o 'b'
    
        def test(self) -> Dict[int, Union[int, str]]:
            a = {'a': {1:0, 2:0}, 'b': {2:0, 3:'cadena'}}
            return a[self.input_data]
    
    

    Para las declaraciones if de una sola línea, debemos asegurarnos de que ambos lados de la condicional devuelvan el mismo tipo, es decir, ambos devuelven enteros o ambos devuelven cadenas. Podemos usar Union[int, str] para representar esto. Una modificación de ejemplo al código sería:

    def test_condition(self, condition: bool) -> Union[int, str]:
        return 1 si condition else "cadena"
    

    Nuevamente, usamos Union[int, str] para indicar que el método puede devolver tanto un entero como una cadena.

Comments are closed.