Creo que es importante hacer distinción entre funciones del generador y generadores (resultado de la función de generador):
>>> def generator_function():
... yield 1
... yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
llamada generador_función no dará resultado normal, incluso no ejecutará ningún código en la función en sí, el resultado será un objeto especial llamado generator:
>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>
por lo que no es función de generador, pero generador:
>>> inspect.isgeneratorfunction(generator)
False
>>> import types
>>> isinstance(generator, types.GeneratorType)
True
y la función del generador no es generador:
>>> isinstance(generator_function, types.GeneratorType)
False
sólo para referencia, llamada real del cuerpo de la función va a suceder mediante el consumo de generador, por ejemplo:
>>> list(generator)
[1, 2]
Véase también In python is there a way to check if a function is a "generator function" before calling it?
¿Qué problema real estás tratando de resolver? Publicar más contexto, puede haber una manera más inteligente. ¿Por qué necesitas saber si es un generador? – Daenyth
'from types import GeneratorType; type (myobject, GeneratorType)' le dará el resultado correcto para los objetos de la clase 'generador'. Pero como Daenyth implica, ese no es necesariamente el camino correcto a seguir. – JAB
Si está buscando '__next__', en realidad está aceptando cualquier iterador, no solo generadores, lo cual es muy probable que desee. – delnan