Bah - «Вы должны переопределить hashCode () в каждом классе, который переопределяет equals ().»
[из Effective Java, by Joshua Bloch?]
Разве это не неправильный путь? Переопределение hashCode, вероятно, означает, что вы пишете класс хеш-ключа, но переопределения равных, конечно же, нет. Существует много классов, которые не используются в качестве хеш-ключей, но по какой-то другой причине они хотят использовать метод логического равенства. Если вы выберете для него «equals», тогда вам может быть поручено написать реализацию hashCode путем чрезмерного применения этого правила. Все, что достигается, - это добавление непроверенного кода в кодовую базу, злое, ожидающее, чтобы кого-то кого-то в будущем. Также писать код, который вам не нужен, является анти-гибким. Это просто неправильно (и созданный идеал, вероятно, будет несовместим с вашими руками).
Конечно, они должны были назначить интерфейс на объекты, написанные для использования в качестве ключей? Несмотря на это, Object никогда не должен был предоставлять hashCode () и equals () imho. Вероятно, это поощряло множество сломанных хеш-коллекций.
Но, во всяком случае, я думаю, что «правило» написано обратно. Тем временем я буду избегать использования «равных» для методов тестирования равенства: - (
Когда объект генератора собирает мусор в конце вашей программы, его метод close()
вызывается, и это вызывает исключение GeneratorExit
внутри генератора. Обычно это не улавливается и приводит к выходу генератора.
Поскольку вы обнаруживаете исключение и получаете другое значение, это вызывает RuntimeError
. Если вы поймаете исключение GeneratorExit
, вам нужно либо сделать ререйз, либо выйти из функции, не принося ничего другого.
Предположим, что у вас есть следующий генератор:
def gen():
with open('important_file') as f:
for line in f:
yield line
, а вы next
один раз и выбрасываете его:
g = gen()
next(g)
del g
Управляющий поток генератора никогда не покидает with
, поэтому файл не закрывается. Чтобы предотвратить это, когда генератор собирает мусор, Python вызывает свой метод close
, который вызывает исключение GeneratorExit
в точке, из которой был создан генератор yield
. Это исключение предназначено для запуска любых блоков finally
или менеджера контекста __exit__
, которые не получили возможности запускать.
Когда вы ловите GeneratorExit
и продолжаете движение, Python видит, что генератор не вышел должным образом. Поскольку это может указывать на то, что ресурсы не были правильно выпущены, Python сообщает об этом как RuntimeError.