Нет встроенного способа напрямую проверять наличие пустых итераторов. Пустые итераторы обычно не считаются исключительными. Однако вы можете определить компактные помощники для явной проверки на наличие пустых итераторов.
Обнаружение пустых итераторов заранее не всегда возможно. В некоторых случаях из источника итератора можно догадаться, является ли он пустым - например, итераторы последовательностей и отображений пусты, если их родительский элемент имеет логическое значение false. Однако сами итераторы не имеют каких-либо указаний на содержимое и могут фактически быть «пустыми», если не повторены.
Единственным надежным способом является проверка, предоставляет ли итератор элементы при выполнении итерации . Можно определить итератор-обертку, который вызывает ошибку, если итератор вообще не предоставляет элементов.
def non_empty(iterable):
"""Helper to ensure that ``iterable`` is not empty during iteration"""
iterator = iter(iterable)
try:
yield next(iterator) # explicitly check first item
except StopIteration:
raise LookupError(f'{iterable} is empty') from None
yield from iterator # forward iteration of later items
Такой помощник может быть обернут как вокруг итераторов, так и итераторов и работает в явных циклах for
1012 * итераторов и любой другой итерационный сценарий.
>>> iterable = []
>>> for element in non_empty(iterable):
... assert isinstance(element, int)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in non_empty
LookupError: [] is empty