En python, ¿cómo verifico si un objeto es un objeto generador?
Intentando esto
>>> type(myobject, generator)
da el error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(Sé que puedo verificar si el objeto tiene un next
método para que sea un generador, pero quiero usar algún método para determinar el tipo de cualquier objeto, no solo los generadores).
from types import GeneratorType;type(myobject, GeneratorType)
le dará el resultado adecuado para los objetos de la clase 'generador'. Pero como Daenyth implica, ese no es necesariamente el camino correcto.__next__
, en realidad está aceptando cualquier iterador, no solo generadores, que es muy probable que sea lo que desea.Respuestas:
Puede usar GeneratorType de tipos:
fuente
isinstance(gen, (types.GeneratorType, map, filter))
sea útil también detectarmap
yfilter
. Sin embargo, esto todavía no incluirá otros iterables e iteradores.¿Te refieres a las funciones del generador? uso
inspect.isgeneratorfunction
.EDITAR:
si desea un objeto generador, puede usar inspect.isgenerator como lo señala JAB en su comentario.
fuente
inspect.isgenerator
.inspect.isgenerator
sólo es una abreviatura para:isinstance(object, types.GeneratorType)
.Creo que es importante hacer una distinción entre las funciones del generador y los generadores (resultado de la función del generador):
llamar a generator_function no producirá un resultado normal, incluso no ejecutará ningún código en la función en sí, el resultado será un objeto especial llamado generador :
entonces no es función del generador, sino generador:
y la función del generador no es generador:
solo como referencia, la llamada real del cuerpo de la función ocurrirá al consumir el generador, por ejemplo:
Ver también En Python, ¿hay alguna manera de verificar si una función es una "función generadora" antes de llamarla?
fuente
La
inspect.isgenerator
función está bien si desea buscar generadores puros (es decir, objetos de la clase "generador"). Sin embargo, volveráFalse
si marca, por ejemplo, unizip
iterable. Una forma alternativa de verificar un generador generalizado es usar esta función:fuente
x=iter([1,2])
. Me parece que realmente está probando si un objeto es o no un iterador , no un generador. Pero tal vez "iterador" es exactamente lo que quiere decir con "generador generalizado".Puede usar el iterador o más específicamente, el generador del módulo de escritura .
resultado:
fuente
typing.TypeVar
clase parecen desalentar el usoisinstance
en conjunto con eltyping
módulo: "En tiempo de ejecución,isinstance(x, T)
aumentaráTypeError
. En general,isinstance()
yissubclass()
no debe usarse con tipos".fuente
No hagas esto. Es simplemente una muy, muy mala idea.
En cambio, haz esto:
En el improbable caso de que el cuerpo del bucle for también tenga
TypeError
s, hay varias opciones: (1) definir una función para limitar el alcance de los errores, o (2) usar un try anidado bloque .O (3) algo como esto para distinguir todos estos
TypeError
s que están flotando.O (4) arregle las otras partes de su aplicación para proporcionar generadores adecuadamente. Eso es a menudo más simple que todo esto.
fuente
if
declaraciones. Y. Ese tipo de micro-optimización es una pérdida de tiempo. Arregle el algoritmo que produce una bolsa mixta de iteradores y no iteradores para producir solo iteradores y ahorrarse todo este dolor.Si está utilizando un servidor web tornado o similar, es posible que haya encontrado que los métodos del servidor son en realidad generadores y no métodos. Esto hace que sea difícil llamar a otros métodos porque el rendimiento no funciona dentro del método y, por lo tanto, debe comenzar a administrar grupos de objetos generadores encadenados. Un método simple para administrar grupos de generadores encadenados es crear una función de ayuda como
Ahora escribiendo generadores encadenados como
Produce salida
Que es probablemente lo que desea si está buscando utilizar generadores como una alternativa de hilo o similar.
fuente
(Sé que es una publicación anterior). No es necesario importar un módulo, puede declarar un objeto para comparar al comienzo del programa:
fuente