>>> gen = (i for i in [])
>>> next(gen)
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
next(gen)
StopIteration
В конце генератора StopIteration
повышен, с тех пор в Вашем конце случая сразу достигнут, исключение повышено. , Но обычно Вы не должны проверять на существование следующего значения.
другая вещь, которую можно сделать:
>>> gen = (i for i in [])
>>> if not list(gen):
print('empty generator')
Насколько мне известно, существует три ситуации, в которых интерфейс оправдан:
Не бойтесь использовать конкретные классы. Не создавайте механически интерфейс для каждого отдельного класса.
Создание интерфейсов для конкретных типов - это тонкий балансирующий процесс, поскольку вы можете легко создать взрыв интерфейса, который не дает никаких преимуществ и только усложняет доменное пространство избыточными типами.
Мое практическое правило - создавать интерфейсы только для типов, которые являются частью общедоступный API. Все типы, которые предназначены для реализации API и никогда не отображаются из API, не нуждаются в интерфейсе.
Одна из причин, по которой я продолжаю программировать интерфейс даже с одной реализацией, состоит в том, что это значительно упрощает написание моих тестов . Я могу настроить прокси для тестирования всего, что хочу проверить, и мне не нужно беспокоиться о тесной связи.
Это не всегда рекомендуется, но об этом стоит подумать, когда вы пытаетесь решить . Как вы думаете, вам нужно будет тщательно протестировать этот класс / объект? Если вы думаете, что будете, то работать с интерфейсом будет намного проще, чем с конкретным классом.
Альтернативой этому было бы не использовать интерфейс и создать подкласс конкретного класса, который тоже работает, но опять же зависит.
Интерфейсы следует развивать, а не создавать. Перед созданием интерфейса у вас должна быть особая потребность в интерфейсе. Если вам не нужно больше одной реализации, вам не нужен интерфейс. Всегда помните, YAGNI
В дополнение к уже данным хорошим ответам (простота тестирования и общедоступные API) я как использование интерфейсов, потому что так легче сосредоточиться на том, «что» должны делать ваши классы, чем на том, «как» они это делают.