在python中,如何检查对象是否为生成器对象?

试着——

>>> type(myobject, generator)

给出错误-

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined

(我知道我可以检查对象是否有下一个方法为它是一个生成器,但我想要一些方法使用,我可以确定任何对象的类型,而不仅仅是生成器。)


当前回答

您可以使用迭代器,或者更具体地说,使用类型模块中的Generator。

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

其他回答

你是说发电机函数?使用inspect.isgeneratorfunction。

编辑:

如果需要生成器对象,可以使用inspect。正如JAB在他的评论中指出的那样。

检查。如果你想检查纯生成器(即类“generator”的对象),Isgenerator函数是很好的。但是,如果您检查,例如,一个izip可迭代对象,它将返回False。检查泛化生成器的另一种方法是使用这个函数:

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

这是一个有点老的问题,然而我正在为自己寻找类似的解决方案,但对于异步生成器类,所以你可能会发现这是有帮助的。

根据utdemir的回复:

import types
isinstance(async_generator(), types.AsyncGeneratorType)
>>> import inspect
>>> 
>>> def foo():
...   yield 'foo'
... 
>>> print inspect.isgeneratorfunction(foo)
True

你可以从类型中使用GeneratorType:

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