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.

¿Es posible escribir una anotación de tipo negativa en Python?

Esto puede parecer irrazonable, pero ahora mismo necesito negar una anotación de tipo. Quiero decir algo como esto

an_int : Not[Iterable]
a_string: Iterable

Esto se debe a que escribí una sobrecarga para una función y mypy no me entiende. Mi función se ve así…

@overload
def iterable(o: Iterable) -> Literal[True] : ...

@overload
def iterable(o: Any) -> Literal[False] : ...

def iterable(o: Iterable|Any) -> Literal[True, False]:
    return isinstance(o, Iterable)

Pero mypy se queja de que la sobrecarga 1 se superpone a la sobrecarga 2 y devuelve un tipo incompatible.

Una anotación de tipo negativa podría resolver fácilmente esto usando Not[Iterable] en lugar de Any en la sobrecarga 2.

¿Alguien sabe cómo resolver este problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no existe el concepto de una anotación de tipo de negación en la escritura de Python. Una posible solución a tu problema es utilizar Union con None en lugar de Not. Por ejemplo, puedes cambiar tu segunda sobrecarga a:

    @overload
    def iterable(o: Union[Iterable, None]) -> Literal[False]: ...
    

    De esta manera, si el argumento es None, coincidirá con la segunda sobrecarga y devolverá False. Si es un objeto iterable, coincidirá con la primera sobrecarga y devolverá True.

    Alternativamente, puedes considerar reestructurar tu código para eliminar la necesidad de la negación por completo.

Comments are closed.