генератор Python с проверкой на пустое состояние

Генераторы python являются хорошей заменой списков в большинстве случаев, за исключением случаев, когда я хотел бы проверить пустое состояние, что невозможно с простыми генераторами. Я пытаюсь написать оболочку, которая позволит проверять пустое состояние, но все еще ленива и дает преимущество генераторам.

class mygen:
  def __init__(self,iterable):
    self.iterable = (x for x in iterable)
    self.peeked = False
    self.peek = None
  def __iter__(self):
    if self.peeked:
      yield self.peek
      self.peeked = False
    for val in self.iterable:
      if self.peeked:
        yield self.peek
        self.peeked = False
      yield val
    if self.peeked:
      yield self.peek
      self.peeked = False
  def __nonzero__(self):
    if self.peeked:
      return True
    try:
      self.peek = self.iterable.next()
      self.peeked = True
      return True
    except:
      return False
  1. Я думаю, что он ведет себя правильно, как обычный генератор. Есть ли угловой случай Я скучаю?
  2. Это не выглядит элегантно. Есть ли лучший более питонический способ сделать то же самое?

Пример использования:

def get_odd(l):
    return mygen(x for x in l if x%2)

def print_odd(odd_nums):
  if odd_nums:
      print "odd numbers found",list(odd_nums)
  else:
      print "No odd numbers found"

print_odd(get_odd([2,4,6,8]))
print_odd(get_odd([2,4,6,8,7]))
11
задан balki 13 July 2012 в 09:09
поделиться