如何检查一个对象是否为Python中的生成器对象?

222 投票
10 回答
77687 浏览
提问于 2025-04-16 19:56

在Python中,我该如何检查一个对象是否是生成器对象呢?

我尝试了

>>> type(myobject, generator)

但是出现了错误

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

(我知道可以通过检查这个对象是否有一个__next__方法来判断它是否是生成器,但我想要一种方法,可以用来判断任何对象的类型,而不仅仅是生成器。)

10 个回答

45

我觉得区分生成器函数生成器(生成器函数的结果)是很重要的:

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

调用生成器函数不会得到普通的结果,甚至不会执行函数内部的任何代码,返回的结果是一个特殊的对象,叫做生成器

>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>

所以这不是生成器函数,而是生成器:

>>> inspect.isgeneratorfunction(generator)
False

>>> import types
>>> isinstance(generator, types.GeneratorType)
True

而生成器函数也不是生成器:

>>> isinstance(generator_function, types.GeneratorType)
False

为了参考,实际执行函数内部的代码是通过消耗生成器来实现的,例如:

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

另请参见 在Python中有没有办法在调用之前检查一个函数是否是“生成器函数”?

51

你是说生成器函数吗?可以使用 inspect.isgeneratorfunction 来检查。

补充:

如果你想要一个生成器对象,可以使用 inspect.isgenerator,正如JAB在他的评论中提到的。

309

你可以使用来自 types 模块的 GeneratorType

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

撰写回答