El docs dice que una clase es manejable siempre que defina el método __hash__
y el método __eq__
. Sin embargo:¿Qué hace que una clase definida por el usuario sea indestructible?
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
¿Qué hace que X
unhashable?
Tenga en cuenta que debo tener listas idénticas (en términos de igualdad regular) para ser hash con el mismo valor; de lo contrario, lo haré violate this requirement en funciones hash:
La única propiedad requerida es que los objetos que se comparan tienen la misma el mismo valor hash
Los documentos advierten de que un objeto hashable no debe ser modificado durante su vida útil y, por supuesto, no modifico las instancias de X
después de la creación. Por supuesto, el intérprete no lo comprobará de todos modos.
Sí, las interfaces de sólo lectura son los mismos, pero ¿por qué se puede esperar tupla .__ hash__ a sólo utilizan las interfaces externas de su propio ¿clase? Especialmente cuando está escrito en C. Usar las interfaces externas sería mucho más lento. No se puede esperar razonablemente que un método de la clase A funcione para la clase B a menos que la clase B esté subclasificada de la clase A. ¿Incluso trataste de llamar a x1 .__ hash __() para ver si funcionaba? –
@LennartRegebro Sí, estoy de acuerdo ... Vea mi último comentario en http: //stackoverflow.com/a/10254636/336527 ... Acabo de tener una congelación cerebral. – max