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 I *think* the only way to tell if a function is a generator without calling it is to inspect the compilation flags of its code object:
>>> from compiler.consts import CO_GENERATOR >>> def is_generator(f): ... return f.func_code.co_flags & CO_GENERATOR != 0 ... >>> def f1(): yield 1 ... >>> def f2(): return 1 ... >>> is_generator(f1) True >>> is_generator(f2) False >>> Michael -- http://mail.python.org/mailman/listinfo/python-list