Testing for empty iterators?

Paul McGuire ptmcg at austin.stopthespam_rr.com
Sat Jul 3 19:10:20 EDT 2004


"Roy Smith" <roy at panix.com> wrote in message
news:roy-03678F.14110203072004 at reader2.panix.com...
> I wrote:
>
> > flag = False
> > for thing in getThingIterator ():
> >    flag = True
> >    break
> > assertEquals (flag, False)
> >
> > Is that really the only way to do it?
>
> Oh, never mind, I got it...
>
> assertEquals (list (getThingIterator ()), [])

In general, I'd say your first approach was better, or something like:

try:
  getThingIterator.next()
  assert False, "getThingIterator pointed to non-empty iterable"
except StopIteration:
  pass # no need to assert, by getting here, we know that getThingIterator
pointed to an empty iterable

Or if you'd prefer a more typical-looking assert:

expectedNullItem = null
try:
  expectedNullItem = getThingIterator.next()
except StopIteration:
  pass
assert expectedNullItem==null, "getThingIterator was supposed to be empty"


Suppose your iterator, through some bug in your code, pointed to a list of
100,000 database records, instead of an empty list as you expected.  Making
a list from this iterator could be very time-consuming, when all you really
needed to know was that the iterator pointed to at least one element.

-- Paul





More information about the Python-list mailing list