В документах говорится, что класс можно хэшировать, если он определяет __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
после создания. Конечно, интерпретатор все равно это не проверит.