Simpler way to run a generator function without caring about items
One very simple and possibly efficient solution could be
def exhaust(generator): all(generator)
if we can assume that generator
will always return True
(as in your case where a tuple of 2 elements (success,table)
is true even if success
and table
both are False
), or: any(generator)
if it will always return False
, and in the "worst case", all(x or True for x in generator)
.
Being that short & simple, you might not even need a function for it!
Regarding the "why?" comment (I dislike these...): There are many cases where one may want to exhaust a generator. To cite just one, it's a way of doing a for loop as an expression, e.g., any(print(i,x) for i,x in enumerate(S))
- of course there are less trivial examples.
Setting up a for loop for this could be relatively expensive, keeping in mind that a for loop in Python is fundamentally successive execution of simple assignment statements; you'll be executing n (number of items in generator) assignments, only to discard the assignment targets afterwards.
You can instead feed the generator to a zero length deque
; consumes at C-speed and does not use up memory as with list
and other callables that materialise iterators/generators:
from collections import deque
def exhaust(generator):
deque(generator, maxlen=0)
Taken from the consume
itertools recipe.