recognizing empty iterators

Gonçalo Rodrigues op73418 at mail.telepac.pt
Mon Jul 21 11:35:48 EDT 2003


On 21 Jul 2003 07:26:15 -0700, mis6 at pitt.edu (Michele Simionato)
wrote:

>After a recent thread on .endswith, I have been thinking about iterators.
>I realized that I don't know a satisfactory way to check if an
>iterator is empty. In other words I am looking for an
>"isempty" function to use in "if" statements such as
>
>if isempty(iterator):
>   do_something()
>
>without side effects. Here are some unsatisfactory ways of implementing
>"isempty":
>
>#1: converting to a list or tuple
>def isempty(iterator):
>    return not list(iterator)
>
>Easy, but one has to create the entire list, thus defecting the basic
>purpose of the iterator, i.e. lazy evaluation.
>
>#2: checking for StopIteration
>def isempty(iterator):
>    try:
>        iterator.next()
>    except StopIteration:
>        return True
>    else:
>        return False
>
>This works, for instance
>
>print isempty(iter([]))
>
>gives True and 
>
>it=iter([1,2,3])
>print isempty(it)
>
>gives False. However, there is a side effect: after the check, the
>iterator has advanced of one step and now "it.next()" gives 2, not 1. 
>In order this to work without side effects, I should be able to restart 
>the iterator from the beginning, but I don't know how to do that.
>Is it possible?
>
>#3: comparing with the empty iterator
>
>emptyiterator=iter([])
>
>it=iter([])
>
>if it == emptyiterator: print 'Ok!'
>
>This simply doesn't work.
>
>I wonder if the itertools module should contain a function to check for
>empty iterators, thus simplifying my life ;) Of course, I may well be
>missing something obvious, if so, please enlighten me.
>

I don't think you're missing anything, the iterator protocol is just
not designed to answer that question. The best that can be got is your
example #2. 

I always make sure to add __nonzero__ to any iterator I code - and
where it makes sense, of course.

>
>                Michele

With my best regards,
G. Rodrigues




More information about the Python-list mailing list