Distinguishing active generators from exhausted ones

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Mon Jul 27 02:22:54 EDT 2009


On Mon, 27 Jul 2009 02:02:19 -0400, Terry Reedy wrote:

> Steven D'Aprano wrote:
>> On Sun, 26 Jul 2009 20:10:00 -0400, Terry Reedy wrote:
>> 
>>> Michal Kwiatkowski wrote:
>>>
>>>> The thing is I don't need the next item. I need to know if the
>>>> generator has stopped without invoking it.
>>> Write a one-ahead iterator class, which I have posted before, that
>>> sets .exhausted to True when next fails.
>> 
>> 
>> And hope that the generator doesn't have side-effects...
> 
> If run to exhastion, the same number of side-effects happen. The only
> difference is that they each happen once step happpen sooner. For
> reading a file that is irrelevant. Much else, and the iterator is not
> just an iterator.

I believe the OP specifically said he needs to detect whether or not an 
iterator is exhausted, without running it to exhaustion, so you shouldn't 
assume that the generator has been exhausted.

When it comes to side-effects, timing matters. For example, a generator 
which cleans up after it has run (deleting temporary files, closing 
sockets, etc.) will leave the environment in a different state if run to 
exhaustion than just before exhaustion. Even if you store the final 
result in a one-ahead class, you haven't saved the environment, and that 
may be significant.

(Of course, it's possible that it isn't significant. Not all differences 
make a difference.)

The best advice is, try to avoid side-effects, especially in generators.


-- 
Steven



More information about the Python-list mailing list