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.

Anotaciones de Python: Iterable Vs Hashable.

No creo que mypy pueda diferenciar entre un Iterable y un Hashable porque los Iterables también pueden ser Hashables. ¿Existe alguna manera de diferenciarlos?

@overload
def contains(o: Hashable) -> bool:...
@overload
def contains(o: Iterable[Hashable]) -> List[bool]:...

Pero mypy dice que la segunda sobrecarga de “contains” nunca se utilizaría porque sus parámetros se superponen con la primera sobrecarga.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, si bien es cierto que los Iterables pueden ser Hashables, aún hay una manera de diferenciar entre los dos. Un enfoque posible es usar la función typing.TypeVar() para definir una variable de tipo que represente tanto a un Hashable como a un Iterable de Hashables. Por ejemplo:

    from typing import TypeVar, Iterable, Hashable, List
    
    T = TypeVar('T', Hashable, Iterable[Hashable])
    
    def contains(o: T) -> List[bool]:
        if isinstance(o, Hashable):
            # manejar el caso Hashable
            return [o in alguna_coleccion_hashable()]
        else:
            # manejar el caso Iterable[Hashable]
            return [x in alguna_coleccion_hashable() for x in o]
    

    Al utilizar la función TypeVar(), hemos definido una variable de tipo T que puede aceptar tanto a un Hashable como a un Iterable de Hashables. En el cuerpo de la función, utilizamos la función isinstance() para comprobar si o es un Hashable, y si es así, lo tratamos como un único elemento y realizamos la comprobación de pertenencia directamente. Si o es un Iterable, utilizamos una comprensión de lista para realizar la comprobación de pertenencia para cada elemento.

    De esta manera, mypy inferirá correctamente el tipo de contains() en función de su argumento de entrada, lo que te permitirá diferenciar entre Hashables e Iterable[Hashable]s y a la vez aprovechar las características de verificación de tipos de mypy.

Comments are closed.