Я склоняюсь к идее, что операторы возврата в середина из функции плохи. Можно использовать возвраты, чтобы создать несколько защитных пунктов во главе функции и конечно сказать компилятор, что возвратиться в конце функции без проблемы, но возвраты в середину из функции может быть легко пропустить и может сделать функцию тяжелее для интерпретации.
Да, любой объект, который не реализует функцию __ hash __ ()
, вернет свой идентификатор при хешировании. Из Справочник по языку Python: Модель данных - Базовая настройка :
Определяемые пользователем классы по умолчанию имеют методы
__ cmp __ ()
и__ hash __ ()
; с ними все объекты сравниваются неравно (кроме самих себя), аx .__ hash __ ()
возвращаетid (x)
.
Однако, если вы хотите иметь уникальный идентификатор, используйте id
, чтобы четко обозначить свои намерения. Хеш объекта должен быть комбинацией хешей его компонентов. Подробнее см. Ссылку выше.
Классы имеют реализации по умолчанию __ eq __
и __ hash __
, которые используют id ()
для сравнения и вычисления хэша. значения соответственно. То есть они сравнивают по идентичности. Основное правило для реализации методов __ hash __
состоит в том, что если два объекта сравниваются как равные друг другу, они также должны иметь одинаковое хеш-значение. Значения хэша можно рассматривать как простую оптимизацию, используемую dicts и наборами для более быстрого поиска одинаковых объектов. Следовательно, если вы измените __ eq __
для выполнения другого вида проверки равенства, вы также должны изменить свою реализацию __ hash __
, чтобы согласиться с этим выбором.
Классы, использующие идентичность для сравнения, могут свободно видоизменяться и использоваться в диктатах и наборах, потому что их идентичность никогда не меняется.