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