Kenneth McDonald wrote: > I'm trying to write a 'flatten' generator which, when give a > generator/iterator that can yield iterators, generators, and other data > types, will 'flatten' everything so that it in turns yields stuff by > simply yielding the instances of other types, and recursively yields the > stuff yielded by the gen/iter objects. > > To do this, I need to determine (as fair as I can see), what are > generator and iterator objects. Unfortunately: > > >>> iter("abc") > <iterator object at 0x61d90> > >>> def f(x): > ... for s in x: yield s > ... > >>> f > <function f at 0x58230> > >>> f.__class__ > <type 'function'> > > So while I can identify iterators, I can't identify generators by class. > > Is there a way to do this? Or perhaps another (better) way to achieve > this flattening effect? itertools doesn't seem to have anything that > will do it. > > Thanks, > Ken
Unfortunately, nothing is as easy as it may seem: >>> def is_generator(f): ... return f.func_code.co_flags & CO_GENERATOR != 0 ... >>> def f(x): ... for s in x: yield s ... >>> is_generator(f) True >>> # But look at the following: >>> def f2(x): ... def g(y): ... for s in y: yield s ... return g(x) ... >>> f2([1,2,3]) <generator object at 0x013DEC88> >>> is_generator(f2) False >>> ;-) - Paddy. -- http://mail.python.org/mailman/listinfo/python-list