Что делает пользовательский -класс нехешируемым?

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

34
задан max 20 April 2012 в 23:05
поделиться