recognizing empty iterators
MBR
vimakefile at yahoo.com
Mon Jul 21 17:51:29 EDT 2003
I guess you could create a BufferedIterator wrapper/mixin that holds
at most one object ahead. (Would only need to cache when IsEmpty was
asked.) Of course, whether this counts as a side-effect depends on
your interator and its use...
mis6 at pitt.edu (Michele Simionato) wrote in message news:<2259b0e2.0307210626.11a1bbf1 at posting.google.com>...
> 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.
>
>
> Michele
More information about the Python-list
mailing list