How do I know if a generator is empty from the start?
Suggestion:
def peek(iterable): try: first = next(iterable) except StopIteration: return None return first, itertools.chain([first], iterable)
Usage:
res = peek(mysequence)if res is None: # sequence is empty. Do stuff.else: first, mysequence = res # Do something with first, maybe? # Then iterate over the sequence: for element in mysequence: # etc.
The simple answer to your question: no, there is no simple way. There are a whole lot of work-arounds.
There really shouldn't be a simple way, because of what generators are: a way to output a sequence of values without holding the sequence in memory. So there's no backward traversal.
You could write a has_next function or maybe even slap it on to a generator as a method with a fancy decorator if you wanted to.
A simple way is to use the optional parameter for next() which is used if the generator is exhausted (or empty). For example:
iterable = some_generator()_exhausted = object()if next(iterable, _exhausted) == _exhausted: print('generator is empty')
Edit: Corrected the problem pointed out in mehtunguh's comment.