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.

Ignorando los errores en el método regular pero lanzando un error en __init__ en mypy.

Tengo una clase que se ve así:

from typing import Optional
import numpy as np

class TestClass():
    def __init__(self, a: Optional[float] = None):
        self.a = np.radians(a)

Esto devuelve el error Argument 1 to "__call__" of "ufunc" has incompatible type "Optional[float]"; expected "Union[Union[int, float, complex, str, bytes, generic], Sequence[Union[int, float, complex, str, bytes, generic]], Sequence[Sequence[Any]], _SupportsArray]"

Sin embargo, la siguiente clase sale sin problemas aunque esencialmente hace lo mismo:

from typing import Optional
import numpy as np

class TestClass():
    def __init__(self, a: Optional[float] = None):
        self.a = a

    def test(self):
        b = np.radians(self.a)

Usando np.radians(None) tampoco tiene efecto sobre ello. ¿Cómo puedo hacer que mypy reconozca que esto también debería causar un error?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que la segunda clase no genera un error es porque mypy no realiza ningún tipo de verificación de tipos dentro de los métodos de una clase. Para que mypy reconozca el error en la segunda clase, se puede usar una sugerencia de tipo a nivel de función en lugar de una sugerencia de tipo a nivel de parámetro, de la siguiente manera:

    from typing import Optional
    import numpy as np
    
    class TestClass():
        def __init__(self, a: Optional[float] = None):
            self.a = a
    
        def test(self):
            b = np.radians(self.a)  # type: ignore
    

    Al agregar el comentario # type: ignore después de la línea que presenta el error, mypy ignorará el error de tipo incompatible que se produce al pasar None a np.radians() y no lo informará. Sin embargo, esto solo debe usarse como solución temporal y no permanente. Una solución mejor sería utilizar una sugerencia de tipo adecuada y manejar los valores None de manera apropiada.

Comments are closed.