Expression can be simplified on list

Chris Angelico rosuav at gmail.com
Thu Sep 29 12:44:36 EDT 2016


On Fri, Sep 30, 2016 at 2:36 AM, MRAB <python at mrabarnett.plus.com> wrote:
> On 2016-09-29 16:56, Steve D'Aprano wrote:
>>
>> On Thu, 29 Sep 2016 09:53 pm, MRAB wrote:
>>
>>> What if an _exhausted_ iterator was falsey?
>>
>>
>>
>> The problem is that in general you can't tell if an iterator is exhausted
>> until you attempt to advance it. So even if bool(iterator) returns True,
>> the call to next() may raise StopIteration:
>>
> [snip]
>
> By "exhausted" I meant "has previously raised StopIteration".

I'm not sure how useful that'd be, especially given that some
iterators actually violate the normal rule of "once you raise, you
raise thereafter". But it's not hard to wrap.

class Iterator:
    def __init__(self, it):
        self.iter = iter(it)
        self.exhausted = False
    def __iter__(self): return self
    def __next__(self):
        try:
            return next(self.iter)
        except StopIteration: # or just 'except:'?
            self.exhausted = True
            raise
    def __bool__(self):
        return self.exhausted

Then you have the edge cases. If next() raises something other than
StopIteration, does that mark the iterator as exhausted? Should the
exhausted flag be cleared if a naughty iterator yields a value after
having StoppedIteration?

(Also, you'd probably want to have some code in here to detect if it's
working with a generator, and if so, pass send/throw down the line
too. Omitted for simplicity.)

ChrisA



More information about the Python-list mailing list