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.
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:Al utilizar la función
TypeVar()
, hemos definido una variable de tipoT
que puede aceptar tanto a un Hashable como a un Iterable de Hashables. En el cuerpo de la función, utilizamos la funciónisinstance()
para comprobar sio
es un Hashable, y si es así, lo tratamos como un único elemento y realizamos la comprobación de pertenencia directamente. Sio
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.