How to identify generator/iterator objects?

Paddy paddy3118 at netscape.net
Thu Oct 26 14:51:27 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

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.




More information about the Python-list mailing list