You need to call next() or loop through the generator object to access the values produced by the generator expression. When there isn't the next value in the generator object, a StopIteration exception is thrown. A for loop can be used to iterate the generator object.
A generator is a special type of function which does not return a single value, instead, it returns an iterator object with a sequence of values.
Coroutines are Generators, but their yield accepts values. Coroutines can pause and resume execution (great for concurrency).
You can use GeneratorType from types:
>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True
You mean generator functions ? use inspect.isgeneratorfunction
.
EDIT :
if you want a generator object you can use inspect.isgenerator as pointed out by JAB in his comment.
I think it is important to make distinction between generator functions and generators (generator function's result):
>>> def generator_function():
... yield 1
... yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
calling generator_function won't yield normal result, it even won't execute any code in the function itself, the result will be special object called generator:
>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>
so it is not generator function, but generator:
>>> inspect.isgeneratorfunction(generator)
False
>>> import types
>>> isinstance(generator, types.GeneratorType)
True
and generator function is not generator:
>>> isinstance(generator_function, types.GeneratorType)
False
just for a reference, actual call of function body will happen by consuming generator, e.g.:
>>> list(generator)
[1, 2]
See also In python is there a way to check if a function is a "generator function" before calling it?
The inspect.isgenerator
function is fine if you want to check for pure generators (i.e. objects of class "generator"). However it will return False
if you check, for example, a izip
iterable. An alternative way for checking for a generalised generator is to use this function:
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
You could use the Iterator or more specifically, the Generator from the typing module.
from typing import Generator, Iterator
g = (i for i in range(1_000_000))
print(type(g))
print(isinstance(g, Generator))
print(isinstance(g, Iterator))
<class 'generator'>
True
True
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With