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 con la unión de callable y generador callable y typevar.

def decorador(
        envuelto: Union[
            Callable[[], T],
            Callable[[], Generator[T, None, None]]
        ]
) -> Callable[[], T]:
    def envoltura():
        valor = envuelto()
        if inspect.isgenerator(valor):
            return next(valor)
        else:
            return valor
    return envoltura

@decorador
def foo() -> Generator[str, None, None]:
    yield "bar"

El código anterior produce el siguiente error en mypy:

error: El argumento 1 de "decorador" tiene un tipo incompatible "Callable[[], Generator[str, None, None]]"; se esperaba "Callable[[], Generator[<nada>, None, None]]"

¿Es esto una limitación en mypy o estoy haciendo algo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Este mensaje de error no es una limitación en mypy. Indica que la anotación de tipo de la función foo no es compatible con la anotación de tipo del argumento wrapped en la función decorator.

    El argumento wrapped en la función decorator espera un callable que devuelva un valor de tipo T o un generador que produzca valores de tipo T. Se espera que el tipo genérico T sea desconocido en este punto.

    Sin embargo, la función foo está anotada para devolver un generador que produce valores de tipo str. Esto no es compatible con el tipo genérico T que se espera en wrapped. El tipo de retorno Generator[str, None, None] de foo es más específico que el tipo Generator[<nothing>, None, None] que espera wrapped.

    Para resolver este error, podrías cambiar la anotación de tipo de wrapped para que coincida con el tipo de retorno más específico de foo. Por ejemplo, podrías anotar wrapped de la siguiente manera:

    def decorator(
            wrapped: Union[
                Callable[[], str],
                Callable[[], Generator[str, None, None]]
            ]
    ) -> Callable[[], str]:
    

    Esto permitiría pasar la función foo como argumento a decorator sin producir un error en mypy.

Comments are closed.