How to identify generator/iterator objects?

Michael Spencer mahs at telcopartners.com
Wed Oct 25 17:31:54 EDT 2006


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




More information about the Python-list mailing list