Los objetos hashables pueden vivir en conjuntos y como claves de diccionario. La inmutabilidad es la forma habitual de garantizar la estabilidad del hash: si el valor de un objeto cambia después de la inserción, las búsquedas fallan silenciosamente.
key = (42, "ada") # tupla de hashables - OKtags = frozenset(["a", "b"]) # conjunto hashable# NO hashable:# bad = ([1, 2],) # lista dentro de tupla# { [1, 2]: "x" } # lista como clave
Cuándo usar esto:
Al usar objetos como claves de diccionario o miembros de conjuntos.
Al construir cachés indexadas por argumentos.
Al diseñar objetos de valor en modelos de dominio.
# dataclasses con unsafe_hash genera __hash__ a partir de los campos@dataclass(frozen=True)class Coord: x: int y: int# deshabilita el hash cuando se necesitan semánticas mutables@dataclass(eq=True, frozen=False)class Buffer: data: bytearray
Dataclass mutable en un conjunto: Dataclass mutable → no hashable por defecto. Solución:frozen=True o excluir de conjuntos.
__eq__ personalizado sin __hash__: Python establece __hash__ = None. Solución: Implementar __hash__ consistente o usar patrones functools.cached_property con cuidado.
El hash cambia cuando los campos cambian: Viola el contrato de diccionario/conjunto. Solución: Solo objetos inmutables como claves.
NaN floats: float('nan') es hashable pero nan != nan. Solución: Evitar claves NaN.
Tuplas con listas mutables dentro: La tupla es hashable pero el contenido de la lista puede mutar, rompiendo invariantes si se expone. Solución: No mutar las mutables anidadas utilizadas en las claves.