Документы говорят, что класс можно хэшировать, если он определяет метод __hash__
и метод __eq__
. Однако:
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'
Что делает X
нехешируемым?
Обратите внимание, что у меня должны быть идентичные списки (с точки зрения регулярного равенства ), чтобы их можно было хешировать до одного и того же значения; в противном случае я нарушу это требование к хэш-функциям:
Единственное требуемое свойство состоит в том, что объекты, которые сравниваются равными, имеют то же значение хеш-функции
Документация предупреждает, что хешируемый объект не должен изменяться в течение его жизни, и, конечно же, я не изменяю экземпляры X
после создания. Конечно, интерпретатор все равно это не проверит.