Избегайте печати «Exception ignored & hellip;» при использовании генератора [дубликат]

Bah - «Вы должны переопределить hashCode () в каждом классе, который переопределяет equals ().»

[из Effective Java, by Joshua Bloch?]

Разве это не неправильный путь? Переопределение hashCode, вероятно, означает, что вы пишете класс хеш-ключа, но переопределения равных, конечно же, нет. Существует много классов, которые не используются в качестве хеш-ключей, но по какой-то другой причине они хотят использовать метод логического равенства. Если вы выберете для него «equals», тогда вам может быть поручено написать реализацию hashCode путем чрезмерного применения этого правила. Все, что достигается, - это добавление непроверенного кода в кодовую базу, злое, ожидающее, чтобы кого-то кого-то в будущем. Также писать код, который вам не нужен, является анти-гибким. Это просто неправильно (и созданный идеал, вероятно, будет несовместим с вашими руками).

Конечно, они должны были назначить интерфейс на объекты, написанные для использования в качестве ключей? Несмотря на это, Object никогда не должен был предоставлять hashCode () и equals () imho. Вероятно, это поощряло множество сломанных хеш-коллекций.

Но, во всяком случае, я думаю, что «правило» написано обратно. Тем временем я буду избегать использования «равных» для методов тестирования равенства: - (

5
задан ruanhao 16 June 2015 в 08:16
поделиться

2 ответа

Когда объект генератора собирает мусор в конце вашей программы, его метод close() вызывается, и это вызывает исключение GeneratorExit внутри генератора. Обычно это не улавливается и приводит к выходу генератора.

Поскольку вы обнаруживаете исключение и получаете другое значение, это вызывает RuntimeError. Если вы поймаете исключение GeneratorExit, вам нужно либо сделать ререйз, либо выйти из функции, не принося ничего другого.

5
ответ дан interjay 23 August 2018 в 19:55
поделиться

Предположим, что у вас есть следующий генератор:

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.

16
ответ дан user2357112 23 August 2018 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: