bool evaluations of generators vs lists

Antoon Pardon apardon at forel.vub.ac.be
Tue Feb 24 02:54:07 EST 2009


On 2009-02-10, Albert Hopkins <marduk at letterboxes.org> wrote:
> On Tue, 2009-02-10 at 12:50 -0800, Josh Dukes wrote:
>
> I don't understand what you mean by this.  But if you really want to
> know if a generator is "non-empty":
>
> def non_empty(virgin_generator):
>     try:
>         virgin_generator.next() # note you just lost the first value
>         return True
>     except StopIteration:
>         return False
>
> The only way to get around this is to put all the values of a generator
> inside a container (e.g. a list):
>
> l = list(generator_object)
>
> but in doing so you've (obviously) lost the advantages of the generator.

Well he could always use a wrapper like the following:

nothing = object()

class BoolIterator (object):
  def __init__(self, iter):
    self.iter = iter
    self.value = nothing
    self.item = nothing

  def __iter__(self):
    return (self)

  def __nonzero__(self):
    if self.value is nothing:
      try:
        self.item = self.iter.next()
        self.value = True
        return True
      except StopIteration:
        self.value = False
        return False
    else:
      return self.value

  def next(self):
    if self.item is not nothing:
      result = self.item
      self.item = nothing
      return result
    if self.value is not nothing:
      return self.iter.next()
    else:
      try:
        result = self.iter.next()
        self.value = True
        return result
      except StopIteration:
        self.value = False
        raise

it1 = BoolIterator(i for i in xrange(10))

for i in it1:
  print i

it2 = BoolIterator(i for i in xrange(10))

if it2:
  print "item found"
  for i in it2:
    print i
else:
  print "problem"

it3 = BoolIterator(i for i in xrange(0))

if it3:
  print "problem"
else:
  print "it3 is empty"




More information about the Python-list mailing list