¿Por qué una tupla que contiene un tipo inestable es inestable?

Por ejemplo, la tupla (1,[0,1,2]) . Entiendo por qué desde una perspectiva de diseño; Si la tupla aún estuviera con posibilidad de hashable, entonces sería trivial hacer que cualquier tipo que no se pueda lavar sea hashable envolviéndolo en una tupla, lo que rompe el comportamiento correcto de la capacidad de hash, ya que puede cambiar el valor del objeto sin cambiar el valor de hash de la tupla. . Pero si la tupla no es hashable, entonces no comprendo qué hace que un objeto sea hashable: pensé que simplemente tenía que tener __hash__(self) , lo que sí ocurre.

Basándome en otras respuestas que he examinado, y de los ejemplos de prueba, parece que tal objeto no es hashable. Parece que el comportamiento sensato sería para tuple.__hash__() llamar a __hash__ para sus objetos componentes, pero no entiendo cómo funcionaría eso desde una perspectiva de implementación, por ejemplo, no sé cómo un diccionario lo reconoce como un sistema no transitable. escriba cuando todavía está __hash__ tuple y tuple sigue definiendo __hash__ .

tuple implementa su propio hash al calcular y combinar los hashes de los valores que contiene. Cuando falla el hash de uno de esos valores, permite que la excepción resultante se propague sin impedimentos.

Ser incondicional solo significa llamar a hash() cuando se activa un TypeError ; una forma de hacerlo es no definir un método __hash__ , pero funciona igual de bien si, en el curso de su método __hash__ , __hash__ un error TypeError (o cualquier otro error realmente) por algún otro medio.

Básicamente, la tuple es un tipo hashable ( isinstance((), collections.abc.Hashable) es verdadero, como isinstance(([],), collections.abc.Hashable) porque es una verificación de nivel de tipo de la existencia de __hash__ ) , pero si almacena tipos inestables, cualquier bash de calcular el hash generará una excepción en el momento del uso, por lo que se comporta como un tipo inestable en ese escenario.

Supongo que la tuple.__hash__() llama al hash(item) para cada elemento de la tupla y luego los resultados de XOR juntos. Si uno de los elementos no es hashable, eso generará un error TypeTrror que mejorará al interlocutor original.