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.

mypy no toma en cuenta la verificación de tipos previamente realizada al evaluar tipos para cálculos aritméticos.

Tengo una clase de Python que se ve así:

from typing import Optional, Union, Dict
import numpy as np

class TestClass():

    def __init__(self, a: Optional[float] = None, b: Optional[float] = None):
        self.a = 1 if a is None else a
        self.b = b

    @property
    def input_values(self) -> Dict[str, Union[float, None]]:
        return {'a': self.a, 'b': self.b}

    @property
    def test_property(self) -> float:
        if None in self.input_values.values():
            raise KeyError('faltan valores')

        return self.a+self.b

Al evaluarlo con mypy devuelve el mensaje de error:

error: Tipos de operando no soportados para + ("float" y "None")
note: El operando derecho es de tipo "Optional[float]"

Pero estoy asegurando que ambos valores no puedan ser None en este punto del flujo de control. ¿Hay una manera diferente que sea reconocida por mypy para realizar estas verificaciones de tipos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma diferente de realizar estas comprobaciones de tipo que es reconocida por mypy. Puede usar sugerencias de tipo para indicar que self.b es un flotante opcional y luego usar una afirmación para asegurarse de que no sea None:

    from typing import Optional, Union, Dict
    import numpy as np
    
    class TestClass():
    
        def __init__(self, a: Optional[float] = None, b: Optional[float] = None):
            self.a = 1 if a is None else a
            self.b: Optional[float] = b
    
        @property
        def input_values(self) -> Dict[str, Union[float, None]]:
            return {'a': self.a, 'b': self.b}
    
        @property
        def test_property(self) -> float:
            assert self.b is not None, "b no puede ser None"
            return self.a + self.b
    

    En este ejemplo, usamos Optional[float] como sugerencia de tipo para self.b, lo que significa que puede ser un flotante o None. Luego, agregamos una afirmación para asegurarnos de que self.b no sea None antes de realizar la operación de suma. Esto permite que mypy reconozca que la operación de suma es válida y no debería generar un error de tipo.

Comments are closed.