On Thu, 2010-10-14 at 10:16 +0100, Tony wrote: > I have been using generators for the first time and wanted to check for > an empty result. Naively I assumed that generators would give > appopriate boolean values. For example > > def xx(): > l = [] > for x in l: > yield x > > y = xx() > bool(y) >
As people have already mentioned, generators are objects and objects (usually) evaluate to True. There may be times, however, that a generator may "know" that it doesn't/isn't/won't generate any values, and so you may be able to override boolean evaluation. Consider this example: class DaysSince(object): def __init__(self, day): self.day = day self.today = datetime.date.today() def __nonzero__(self): if self.day > self.today: return False return True def __iter__(self): one_day = datetime.timedelta(1) new_day = self.day while True: new_day = new_day + one_day if new_day <= self.today: yield new_day else: break g1 = DaysSince(datetime.date(2010, 10, 10)) print bool(g1) for day in g1: print day g2 = DaysSince(datetime.date(2011, 10, 10)) print bool(g2) for day in g2: print day > True > 2010-10-11 > 2010-10-12 > 2010-10-13 > 2010-10-14 > False -- http://mail.python.org/mailman/listinfo/python-list