que iteradores generadores generador español codigo python generator

iteradores - que es un iterable en python



¿Cómo verificar si un objeto es un objeto generador en python? (7)

Sé que puedo verificar si el objeto tiene un próximo método para que sea un generador, pero quiero usar de alguna manera el cual pueda determinar el tipo de cualquier objeto, no solo los generadores.

No hagas esto Es simplemente una idea muy, muy mala.

En cambio, haz esto:

try: # Attempt to see if you have an iterable object. for i in some_thing_which_may_be_a_generator: # The real work on `i` except TypeError: # some_thing_which_may_be_a_generator isn''t actually a generator # do something else

En el caso improbable 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 bloque try anidado.

O (3) algo así para distinguir todos estos TypeError s que están flotando.

try: # Attempt to see if you have an iterable object. # In the case of a generator or iterator iter simply # returns the value it was passed. iterator = iter(some_thing_which_may_be_a_generator) except TypeError: # some_thing_which_may_be_a_generator isn''t actually a generator # do something else else: for i in iterator: # the real work on `i`

O (4) arregle las otras partes de su aplicación para proporcionar generadores de manera apropiada. Eso es a menudo más simple que todo esto.

En Python, ¿cómo puedo verificar si un objeto es un generador?

Probando 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 de alguna manera el cual pueda determinar el tipo de cualquier objeto, no solo los generadores).



Creo que es importante hacer una distinción entre las funciones del generador y los generadores (resultado de la función del generador):

>>> def generator_function(): ... yield 1 ... yield 2 ... >>> import inspect >>> inspect.isgeneratorfunction(generator_function) True

Llamar 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>

entonces no es la función del generador, sino el 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

solo como referencia, la llamada real del cuerpo de la función se producirá al consumir un generador, por ejemplo:

>>> list(generator) [1, 2]

Ver también ¿ En python hay una manera de verificar si una función es una "función del generador" antes de llamarla?


La función inspect.isgenerator está bien si desea comprobar si hay generadores puros (es decir, objetos de clase "generador"). Sin embargo, devolverá False si comprueba, por ejemplo, un izip iterable. Una forma alternativa de buscar un generador generalizado es usar esta función:

def isgenerator(iterable): return hasattr(iterable,''__iter__'') and not hasattr(iterable,''__len__'')


Puede usar GeneratorType de tipos:

>>> import types >>> types.GeneratorType <class ''generator''> >>> gen = (i for i in range(10)) >>> isinstance(gen, types.GeneratorType) True


Si está usando tornado webserver o similar, puede haber encontrado que los métodos de servidor son en realidad generadores y no métodos. Esto hace que sea difícil llamar a otros métodos porque el rendimiento no está funcionando dentro del método y, por lo tanto, debe comenzar a administrar grupos de objetos de generador encadenados. Un método simple para administrar pools de generadores encadenados es crear una función de ayuda como

def chainPool(*arg): for f in arg: if(hasattr(f,"__iter__")): for e in f: yield e else: yield f

Ahora escribiendo generadores encadenados como

[x for x in chainPool(chainPool(1,2),3,4,chainPool(5,chainPool(6)))]

Produce salida

[1, 2, 3, 4, 5, 6]

Que es probablemente lo que quieres si buscas usar generadores como un hilo alternativo o similar.


>>> import inspect >>> >>> def foo(): ... yield ''foo'' ... >>> print inspect.isgeneratorfunction(foo) True