Michael Spencer wrote: > 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 > >>>
It should be noted that this checking is completely irrelevant for the purpose of writing flatten generator. Given def inc(n): yield n+1 the following conditions should be true: list(flatten([inc,inc])) == [inc,inc] list(flatten([inc(3),inc(4)]) == [4,5] -- Leo -- http://mail.python.org/mailman/listinfo/python-list