On Mon, 02 May 2005 16:14:57 -0700, Brian Roberts wrote: > Q1: Is there a better or alternate way to handle this? Q2: Is there a way > that handles both lists and generators, so I don't have to worry about > which one I've got?
Are you in control of your generators? You could put a method on them that tells if there is anything in them by manually implementing the .next() call. The other thing you could do is a generator wrapper that can tell for you, but you'll lose some performance: class EmptyGeneratorDetector(object): """Provides a method you can call to detect an empty generator. You should probably name this class something shorter. Check if the generator is empty after construction by looking at the isEmpty property.""" def __init__(self, generator): self.generator = generator self.isEmpty = False self.givenFirst = False try: self.firstItem = generator.next() except StopIteration: self.isEmpty = True def next(self): if self.isEmpty: raise StopIteration if not self.givenFirst: self.givenFirst = True return self.firstItem else: return self.generator.next() def __iter__(self): return self In action: Python 2.3.5 (#1, Mar 3 2005, 17:32:12) [GCC 3.4.3 (Gentoo Linux 3.4.3, ssp-3.4.3-0, pie-8.7.6.6)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from genwrap import * >>> def emptyGenerator(): ... raise StopIteration ... yield None ... >>> def nonEmptyGenerator(): ... yield 1 ... yield 2 ... yield 3 ... >>> e = emptyGenerator() >>> n = nonEmptyGenerator() >>> E = EmptyGeneratorDetector(e) >>> N = EmptyGeneratorDetector(n) >>> E.isEmpty True >>> N.isEmpty False >>> for i in E: ... print i ... >>> for i in N: ... print i ... 1 2 3 >>> It is tested as much as you see it above :-) (I recall a lengthy discussion of the best way to create an empty iterator a while back, and that was not the winner. But it will do for now.) -- http://mail.python.org/mailman/listinfo/python-list